Pandas - 拆分列以分隔正数和负数

时间:2014-09-24 14:39:39

标签: pandas split calculated-columns

我有一个数据框,其中有许多列包含数字数据。在每一列中都可以找到正数和负数,但我想将它们分成各自的列。 目前,数据框如下所示:

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 个答案:

答案 0 :(得分: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