熊猫groupby,每个值都有一个新列

时间:2019-04-07 12:14:45

标签: python pandas

我希望标题能说明一切;我想补充一点,可以假设每个键具有相同数量的值。 在线搜索标题产生了以下解决方案:

Split pandas dataframe based on groupby

本来可以解决我的问题,但事实并非如此。 我举一个例子:

输入:

pd.DataFrame(data={'a':['foo','foo','foo','bar','bar','bar'],'b':[1,2,3,4,5,6]})

输出:

pd.DataFrame(data={'a':['foo','bar'],'b':[1,4],'c':[2,5],'d':[3,6]})

从直觉上讲,它可以是没有聚合功能的groupby函数,或者是从键中列出列表的聚合功能。

显然,可以使用for循环等“手动”完成此操作,但是使用具有大数据集的for循环在计算上非常昂贵。

2 个答案:

答案 0 :(得分:2)

GroupBy.cumcount用于Series或列g,然后通过DataFrame.set_index + Series.unstackDataFrame.pivot重塑形状,最后通过{{ 3}},DataFrame.add_prefixDataFrame.rename_axis

g = df1.groupby('a').cumcount()
df = (df1.set_index(['a', g])['b']
         .unstack()
         .add_prefix('new_')
         .reset_index()
         .rename_axis(None, axis=1))
print (df)
     a  new_0  new_1  new_2
0  bar      4      5      6
1  foo      1      2      3

或者:

df1['g'] = df1.groupby('a').cumcount()
df = df1.pivot('a','g','b').add_prefix('new_').reset_index().rename_axis(None, axis=1)
print (df)
     a  new_0  new_1  new_2
0  bar      4      5      6
1  foo      1      2      3

答案 1 :(得分:1)

这是另一种方法,如果列名很重要,则使用groupby.applystring.ascii_lowercase

from string import ascii_lowercase

df = pd.DataFrame(data={'a':['foo','foo','foo','bar','bar','bar'],'b':[1,2,3,4,5,6]})

# Groupby 'a'
g = df.groupby('a')['b'].apply(list)

# Construct new DataFrame from g
new_df = pd.DataFrame(g.values.tolist(), index=g.index).reset_index()

# Fix column names
new_df.columns = [x for x in ascii_lowercase[:new_df.shape[1]]]

print(new_df)

     a  b  c  d
0  bar  4  5  6
1  foo  1  2  3