我有一只熊猫,上面有几列
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。
答案 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