AttributeError:“系列”对象没有属性“列”

时间:2019-11-29 15:13:29

标签: python pandas

我有一个看起来像这样的数据框:

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'

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

GroupBy.aggas_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()