Python Groupby以创建新列

Python Groupby以创建新列,python,pandas,group-by,pandas-groupby,Python,Pandas,Group By,Pandas Groupby,从dataframe,如果已经找到索引,我想创建一个包含新列的dataframe,但我不知道要创建多少列: pd.DataFrame([["John","guitar"],["Michael","football"],["Andrew","running"],["John","dancing"],["Andrew","cars"]]) 我想: pd.DataFrame([["John","guitar","dancing"],["Michael","Football",None],["Andr

从dataframe,如果已经找到索引,我想创建一个包含新列的dataframe,但我不知道要创建多少列:

pd.DataFrame([["John","guitar"],["Michael","football"],["Andrew","running"],["John","dancing"],["Andrew","cars"]])
我想:

pd.DataFrame([["John","guitar","dancing"],["Michael","Football",None],["Andrew","running","cars"]])
不知道一开始应该创建多少列。

用于get
计数器
,然后通过以下方式重塑形状:

或聚合
列表
并按构造函数创建新词典:

s = df1.groupby('a')['b'].agg(list)
df = pd.DataFrame(s.values.tolist(), index=s.index).reset_index()
print (df)
         a         0        1
0   Andrew   running     cars
1     John    guitar  dancing
2  Michael  football     None
您可以按
人分组
,并在
爱好
中搜索。然后使用
.apply(pd.Series)
将列表展开为列:

df.groupby('person').hobby.unique().apply(pd.Series).reset_index()
    person         0        1
0   Andrew   running     cars
1     John    guitar  dancing
2  Michael  football      NaN
如果数据帧较大,请尝试更有效的替代方案:

df = df.groupby('person').hobby.unique()
df = pd.DataFrame(df.values.tolist(), index=df.index).reset_index()

这在本质上是相同的,但在应用
pd.Series
时避免在行上循环

假设列名是
['person','activity']
您可以这样做

df_out = df.groupby('person').agg(list).reset_index()
df_out = pd.concat([df_out, pd.DataFrame(df_out['activity'].values.tolist())], axis=1)
df_out = df_out.drop('activity', 1)
给你

    person         0        1
0   Andrew   running     cars
1     John    guitar  dancing
2  Michael  football     None

你的答案有什么问题?为什么是独一无二的?为什么
pd.Series
什么是真正的慢?是的,我同意
.apply(pd.Series)
不是非常大的数据帧的最佳选择,但如果不是这样的话,它会起到作用。“为什么独特”-我假设OP想要的是记录每个人的数据框中存在哪些爱好。否则请告诉我@ffl75@FFL75更新了一个更快的替代方案,更适合大数据帧实际上,在我的实际用例中,知道值repeat非常好,并且在这个示例中,它并没有声明显示唯一的值:)我不确定为什么否决@jezrael,先生,@RavinderSingh13-谢谢你,这是一个很好的解决方案。
df_out = df.groupby('person').agg(list).reset_index()
df_out = pd.concat([df_out, pd.DataFrame(df_out['activity'].values.tolist())], axis=1)
df_out = df_out.drop('activity', 1)
    person         0        1
0   Andrew   running     cars
1     John    guitar  dancing
2  Michael  football     None