熊猫 - 拆分列以分隔正数和负数
问题描述:
我有一个数据框,其中有许多列包含数字数据。正数和负数都可以在每一列中找到,但我想将它们分成它们自己的一组列。 目前,该数据帧是这样的:熊猫 - 拆分列以分隔正数和负数
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治疗找出一个脚本解决方案的每一列的值作为一个数组,将负值复制到一个新的列中,并从原始列表中删除它们(如果我需要这样做,我会将其作为答案发布)但这会使我产生一个问题,命令解决方案有人知道怎么做吗?
答
我们可以使用布尔掩蔽选择感兴趣的值,然后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
或'join'而不是'concat':'df [df> = 0] .join(df [df DSM 2014-09-24 14:45:51
@DSM是的,实际上更整洁,会更新 – EdChum 2014-09-24 14:47:15