我有一个看起来像这样的数据框:
id userid int1 int2 string string2 string3
1 90 5067 1000 aaa 100 qqq
1 90 6945 1000 bbb 101 qqq
1 90 9596 1010 ccc 102 qqq
所需的输出:
id userid int1 int2 string string2 string3
1 90 [5067,6945,9596] [1000,1000,1010] [aaa,bbb,ccc] [100,101,102] qqq
我尝试为int1,int2,string,string2创建一个新的数据框,然后将它们合并,但是由于我有一个大数据集,所以此解决方案非常慢。另一种解决方案是使用“ groupby”:
df = df.groupby(['id','userid','string3']).[['int1'],['int2'],['string'],['string2']].apply(list).reset_index()
但这给了我这个错误:
AttributeError: 'Series' object has no attribute 'columns'
感谢您的帮助。
答案 0 :(得分:2)
将GroupBy.agg
与as_index=False
+ DataFrame.reindex
一起使用
以初始顺序返回列:
new_df=( df.groupby(['id','userid','string3'],as_index=False)
.agg(list)
.reindex(columns=df.columns) )
print(new_df)
如果需要,您可以选择列:
cols=['int1','int2','string','string2']
new_df=( df.groupby(['id','userid','string3'],as_index=False)[cols]
.agg(list)
.reindex(columns=df.columns) )
输出
id userid int1 int2 string \
0 1 90 [5067, 6945, 9596] [1000, 1000, 1010] [aaa, bbb, ccc]
string2 string3
0 [100, 101, 102] qqq
答案 1 :(得分:0)
您正在列表中传递单个值(列表)。您不需要像过滤数据框和期望数据框输出时那样使用双括号。希望这对您会更好:
df = df.groupby(['id','userid','string3'])['int1','int2','string','string2'].apply(list).reset_index()