拆分摘要数据并重新汇总

时间:2019-06-25 11:11:50

标签: python pandas

我有一个摘要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这样的行,但是将ApplesKumquats都增加了5

在Pandas中有很好的方法吗?

4 个答案:

答案 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
>>>