将熊猫中一列的多行整理为一行,同时保持该列的数据类型

时间:2018-11-10 21:08:28

标签: python pandas

我有一只熊猫,上面有几列

username A time place
AAA      B 1    YYY
AAA      C 2    YYY
AAA      D 1    YYY
AAA      B 3    ZZZ
AAA      C 4    ZZZ
AAA      B 3    ZZZ
BBB      B 1    YYY
BBB      C 2    YYY
BBB      D 1    YYY
BBB      B 7    ZZZ
BBB      C 8    ZZZ
BBB      B 9    ZZZ
CCC      B 6    YYY
CCC      C 5    YYY
CCC      D 8    YYY
CCC      B 7    ZZZ
CCC      C 8    ZZZ
CCC      B 9    ZZZ

在上述熊猫中,除时间以外的所有列均为字符串。 TIme是浮点列。

我正在尝试创建一个序列,以便对于每个用户名,我希望用户名的所有行都整理为一行。输出数据框要看起来像这样。

username A           time        place
AAA      B+C+D+B+C+B 1+2+1+3+4+3 YYY+YYY+YYY+ZZZ+ZZZ+ZZZ
BBB      B+C+D+B+C+B 1+2+1+7+8+9 YYY+YYY+YYY+ZZZ+ZZZ+ZZZ
CCC      B+C+D+B+C+B 6+5+8+7+8+9 YYY+YYY+YYY+ZZZ+ZZZ+ZZZ

我正在使用'+'作为分隔符,但是它可以是通常用于分隔符的任何字符(例如,/ \ ..etc)

我已经能够使用

对所有列执行此操作
df.groupby('username')['A].apply('+',join).reset_index()

,所有列均相同。我终于合并了所有的df文件,以获得我想要的表格。

对于时间列,我可以执行,但希望获取浮点类型的列。我很难做到这一点。希望有更多知识的人可以在这里指导我。

我什至尝试在事实发生后更改输出列     df ['time']。astype(float)

但是我得到了所有NaN。

1 个答案:

答案 0 :(得分:1)

我相信您需要使用agg将所有列转换为字符串:

df = df.astype(str).groupby('username', as_index=False).agg('+'.join)
print (df)
  username            A                     time                    place
0      AAA  B+C+D+B+C+B  1.0+2.0+1.0+3.0+4.0+3.0  YYY+YYY+YYY+ZZZ+ZZZ+ZZZ
1      BBB  B+C+D+B+C+B  1.0+2.0+1.0+7.0+8.0+9.0  YYY+YYY+YYY+ZZZ+ZZZ+ZZZ
2      CCC  B+C+D+B+C+B  6.0+5.0+8.0+7.0+8.0+9.0  YYY+YYY+YYY+ZZZ+ZZZ+ZZZ

如果需要sum个数字列并通过+个字符串列进行连接:

df = (df.groupby('username', as_index=False)
       .agg(lambda x: x.sum() if np.issubdtype(x.dtype, np.number) else '+'.join(x)))
print (df)
  username            A  time                    place
0      AAA  B+C+D+B+C+B  14.0  YYY+YYY+YYY+ZZZ+ZZZ+ZZZ
1      BBB  B+C+D+B+C+B  28.0  YYY+YYY+YYY+ZZZ+ZZZ+ZZZ
2      CCC  B+C+D+B+C+B  43.0  YYY+YYY+YYY+ZZZ+ZZZ+ZZZ