我的初始DataFrame如下所示:
A B quantity
0 1 foo 1
1 1 baz 2
2 1 bar 2
3 1 faz 1
4 2 foo 2
5 2 bar 1
6 3 foo 3
我需要将其分组为“A”并列出“B”乘以“数量”:
A B
0 1 [foo, baz, baz, bar, bar, faz]
1 2 [foo, foo, bar]
2 3 [foo, foo, foo]
目前我正在使用groupby()然后应用():
def itemsToList(tdf, column):
collist = []
for row in tdf[column].iteritems():
collist = collist + tdf['quantity'][row[0]]*[row[1]]
return pd.Series({column: collist})
gb = df.groupby('A').apply(itemsToList, 'B')
我怀疑这是一种有效的方式,所以我正在寻找一种好的“熊猫”方法来实现这一目标。
答案 0 :(得分:4)
这可以分两步完成,生成一个新列,用于创建扩展的str值,然后groupby
在' A'和apply
Self::Dir::Person
到这个新专栏:
list
修改强>
从@Jianxun Li的回答中获取灵感之后确定
In [62]:
df['expand'] = df.apply(lambda x: ','.join([x['B']] * x['quantity']), axis=1)
df.groupby('A')['expand'].apply(list)
Out[62]:
A
1 [foo, baz,baz, bar,bar, faz]
2 [foo,foo, bar]
3 [foo,foo,foo]
Name: expand, dtype: object
这也有效:
In [130]:
df.groupby('A').apply(lambda x: np.repeat(x['B'].values, x['quantity']).tolist())
Out[130]:
A
1 [foo, baz, baz, bar, bar, faz]
2 [foo, foo, bar]
3 [foo, foo, foo]
dtype: object
答案 1 :(得分:2)
另一种方法。首先使用df
然后pivot_table
apply
重塑np.repeat().tolist()
。
import pandas as pd
import numpy as np
df
Out[52]:
A B quantity
0 1 foo 1
1 1 baz 2
2 1 bar 2
3 1 faz 1
4 2 foo 2
5 2 bar 1
6 3 foo 3
df.pivot('A','B','quantity').fillna(0).apply(lambda row: np.repeat(row.index.values, row.values.astype(int)).tolist(), axis=1)
Out[53]:
A
1 [bar, bar, baz, baz, faz, foo]
2 [bar, foo, foo]
3 [foo, foo, foo]
dtype: object