我有一只 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
在上面的 panda 中,除了 time 之外的所有列都是字符串。 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
我使用“+”作为分隔符,但它可以是通常用于分隔符的任何字符(例如,/\..等)
我已经能够使用
对所有列执行此操作df.groupby('username')['A].apply('+',join).reset_index()
所有列都相同。我终于合并了所有单独的 df` 以获得我想要的形式。
对于时间列,我可以做,但我希望获得一个 float 类型的列。我很难做到这一点。希望更有知识的人可以指导我。
我什至尝试在事后更改输出列 df['时间'].astype(float)
但我得到的都是 NaN。
最佳答案
我相信您需要使用 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
如果需要求和
数字列并通过+
字符串列连接:
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
关于python - 将 panda 中一列的多行整理为一行,同时保持列的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53243419/