【发布时间】:2018-12-22 14:19:11
【问题描述】:
目前我的数据框看起来类似于:
ID Year Str1 Str2 Value
0 1 2014 high black 120
1 1 2015 high blue 20
2 2 2014 medium red 10
3 2 2014 medium blue 50
4 3 2015 low blue 30
5 3 2015 high blue .5
6 3 2015 high red 10
期望:
ID Year Str1 Str2 Value
0 1 2014 high black 120
1 1 2015 high blue 20
2 2 2014 medium red, blue 60
3 3 2015 low, high blue, red 40.5
尝试按列 ID 和名称进行分组,然后得到数字的总和,但得到字符串列表。如果可以像示例中那样删除重复的字符串,那将很有帮助,但不是必需的。
此操作将对大约 100 个数据帧进行,ID 和年份是唯一可以在每个数据帧中找到的列名。数据框确实略有不同:它们有 value 列、str 列或两者都有。
我已经浏览了很多stackoverflow并尝试过:
df.groupby(['ID', 'Year'], as_index=False).agg(lambda x: x.sum() if x.dtype=='int64' else ', '.join(x))
这给出了错误 DataFrame object has no attribute dtype(这是有道理的,因为按多列分组会返回更多数据帧)。
我也尝试将列一一循环,然后如果列有数字,它会计算总和,否则列一个列表:
for col in df:
if col in ['ID', 'Year']:
continue
if df[col].dtype.kind == 'i' or df[col].dtype.kind == 'f':
df = df.groupby(['ID', 'Year'])[col].apply(sum)
else:
df = df.groupby(['ID', 'Year'])[col].unique().reset_index()
但是,在第一次执行操作后,它摆脱了所有其他列。
提前致谢。
【问题讨论】:
标签: python pandas pandas-groupby