我有一个数据框,其中有许多列包含数字数据。在每一列中都可以找到正数和负数,但我想将它们分成各自的列。 目前,数据框如下所示:
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 将每个列的值视为一个数组,将负值复制到一个新列并从原始列中删除它们(如果我最终需要这样做,我会发布一个答案)但这可能会让我觉得这可能是一个单一命令解决方案的问题。有谁知道怎么做?
答案 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