2014-09-24 55 views
0

我有一个数据框,其中有许多列包含数字数据。正数和负数都可以在每一列中找到,但我想将它们分成它们自己的一组列。 目前,该数据帧是这样的:熊猫 - 拆分列以分隔正数和负数

0 Col1 Col2 Col3 
1 55  43  98 
2 -20  35  88 
3 -43  -47  -77 

我想修改,所以它看起来是这样的:

0 Col_1A Col_2A Col_3A  Col_1B Col_2B Col_3B 
1 55  43  98   NaN  NaN  NaN  
2 NaN  35  88   -20  NaN  NaN 
3 NaN  NaN  NaN   -43  -47  -77 

我想我可以使用lapply治疗找出一个脚本解决方案的每一列的值作为一个数组,将负值复制到一个新的列中,并从原始列表中删除它们(如果我需要这样做,我会将其作为答案发布)但这会使我产生一个问题,命令解决方案有人知道怎么做吗?

回答

1

我们可以使用布尔掩蔽选择感兴趣的值,然后concat它们传递axis=1,然后你可以仅仅通过直接分配给columns属性重命名:

In [145]: 

merged = pd.concat([df[df>=0], df[df<0]], axis=1) 
merged.columns = ['Col_1A','Col_2A','Col_3A','Col_1B','Col_2B','Col_3B'] 
merged 
Out[145]: 
    Col_1A Col_2A Col_3A Col_1B Col_2B Col_3B 
0             
1  55  43  98  NaN  NaN  NaN 
2  NaN  35  88  -20  NaN  NaN 
3  NaN  NaN  NaN  -43  -47  -77 

你可以join并设置所需的后缀(感谢@DSM):

In [147]: 

df[df>=0].join(df[df<0], lsuffix="_A", rsuffix="_B") 
Out[147]: 
    Col1_A Col2_A Col3_A Col1_B Col2_B Col3_B 
0             
1  55  43  98  NaN  NaN  NaN 
2  NaN  35  88  -20  NaN  NaN 
3  NaN  NaN  NaN  -43  -47  -77 

另一种方法是merge(这是什么join下使用):

In [148]: 

df[df>=0].merge(df[df<0], left_index=True, right_index=True, suffixes=('_A', '_B')) 
Out[148]: 
    Col1_A Col2_A Col3_A Col1_B Col2_B Col3_B 
0             
1  55  43  98  NaN  NaN  NaN 
2  NaN  35  88  -20  NaN  NaN 
3  NaN  NaN  NaN  -43  -47  -77 
+1

或'join'而不是'concat':'df [df> = 0] .join(df [df <0],lsuffix =“A”,rsuffix =“B”)''。 – DSM 2014-09-24 14:45:51

+0

@DSM是的,实际上更整洁,会更新 – EdChum 2014-09-24 14:47:15