2016-12-26 105 views
1

我有一个熊猫DF,看起来像这样:Python的大熊猫 - 合并两列的数据帧

 TTL1 TTL2 
0 val1  
1 val2 
2 val3 
3    val4 
4 val5  
5 val6 
6 val7 
7    val8 

,我想让它像这样:

 TTL1 
0 val1  
1 val2 
2 val3 
3 val4 
4 val5  
5 val6 
6 val7 
7 val8 

任何想法如何取悦我可以做到这一点?

+0

你有'NaN'的或' '''(空字符串)在'TTL1'列? – MaxU

回答

3

条件设置如何?

In [260]: df.loc[df.TTL1 == '', 'TTL1'] = df.TTL2 

In [261]: df 
Out[261]: 
    TTL1 TTL2 
0 val1 
1 val2 
2 val3 
3 val4 val4 
4 val5 
5 val6 
6 val7 
7 val8 val8 

备选地,使用np.where

In [266]: df.TTL1 = np.where(df.TTL1 == '', df.TTL2, df.TTL1) 

In [267]: df 
Out[267]: 
    TTL1 TTL2 
0 val1 
1 val2 
2 val3 
3 val4 val4 
4 val5 
5 val6 
6 val7 
7 val8 val8 
+0

如果这些是空白,肯定会更直接。 – piRSquared

2

SET_UP

df = pd.DataFrame([ 
     ['val1', np.nan], 
     ['val2', np.nan], 
     ['val3', np.nan], 
     [np.nan, 'val4'], 
     ['val5', np.nan], 
     ['val6', np.nan], 
     ['val7', np.nan], 
     [np.nan, 'val8'] 
    ], columns=['TTL1', 'TTL2']) 

最简单的答案是使用combine_first

df.TTL1.combine_first(df.TTL2).to_frame() 

    TTL1 
0 val1 
1 val2 
2 val3 
3 val4 
4 val5 
5 val6 
6 val7 
7 val8 

如果这些空白实际上是''然后做这第一个

df.replace('', np.nan, inplace=True) 
+0

这不起作用。也许是因为我在TTL2之后有更多列? – TheDaJon

+1

它适合我。这意味着在运行的和我正在运行的程序之间有一些不明显的区别。这可能是库版本(怀疑它),或数据差异(可能),或用户错误(你的或我的)。提出问题的最佳方式是提供创建数据的代码片段。这样,我们正在处理的数据集几乎没有含糊不清的地方。我会用一个例子更新我的文章。 – piRSquared

1

又一溶液(假定OP具有在TTL1NaN的):

In [127]: df.TTL1.fillna(df.TTL2) 
Out[127]: 
0 val1 
1 val2 
2 val3 
3 val4 
4 val5 
5 val6 
6 val7 
7 val8 
Name: TTL1, dtype: object 
0

有一个在一个位模糊问题,但熊猫方法stack是用来把所有的价值观放在一个单一的公司lumn。

df.stack() 

输出

0 TTL1 val1 
1 TTL1 val2 
2 TTL1 val3 
3 TTL2 val4 
4 TTL1 val5 
5 TTL1 val6 
6 TTL1 val7 
7 TTL2 val8 
dtype: object