我有一个摘要df,看起来像这样:
Apples 100
Bananas 34
Kumquats 54
Greengages 101
Apples;Kumquats 5
Bananas;Greengages 7
我想通过将组合水果的数量分成单个项目来简化它:
Apples 105
Bananas 41
Kumquats 59
Greengages 108
即我删除了像Apples;Kumquats
这样的行,但是将Apples
和Kumquats
都增加了5
。
在Pandas中有很好的方法吗?
答案 0 :(得分:1)
您可以用;
分割值,用stack
整形并汇总sum
:
print (df)
a b
0 Apples 100
1 Bananas 34
2 Kumquats 54
3 Greengages 101
4 Apples;Kumquats 5
5 Bananas;Greengages 7
df1 = (df.set_index('b')['a']
.str.split(';', expand=True)
.stack()
.reset_index(name='c')
.groupby('c', as_index=False)['b'].sum())
print (df1)
c b
0 Apples 105
1 Bananas 41
2 Greengages 108
3 Kumquats 59
或使用defaultdict
解决方案:
from collections import defaultdict
d = defaultdict(int)
for a, b in zip(df['a'], df['b']):
for x in a.split(';'):
d[x] += b
df = pd.DataFrame({'a':list(d.keys()), 'b':list(d.values())})
print (df)
a b
0 Apples 105
1 Bananas 41
2 Kumquats 59
3 Greengages 108
答案 1 :(得分:1)
您可以使用str.get_dummies
设置;
作为分隔符,并乘以相应的数量:
df.food.str.get_dummies(sep=';').mul(df.quantity.values[:,None]).sum()
Apples 105
Bananas 41
Greengages 108
Kumquats 59
dtype: int64
输入数据:
print(df)
food quantity
0 Apples 100
1 Bananas 34
2 Kumquats 54
3 Greengages 101
4 Apples;Kumquats 5
5 Bananas;Greengages 7
答案 2 :(得分:0)
您可以使用str.get_dummies
进行转置,然后乘以计数,计数将在数据帧中广播:
(df['fruit'].str.get_dummies(';').T * df['count']).sum(axis=1)
输出:
Apples 105
Bananas 41
Greengages 108
Kumquats 59
dtype: int64
答案 3 :(得分:0)
也许:
>>> pd.DataFrame([[x, s[s.index.str.contains(x)].tolist()] for i in s.reset_index()['index'].str.split(';').values.tolist() for x in i]).apply(lambda x: [x[0], sum(x[1])], axis=1).drop_duplicates()
0 1
0 Apples 105
1 Bananas 41
2 Kumquats 59
3 Greengages 108
>>>