具有多个值的 Groupby 列

Groupby column with multiple values

我有一个看起来像这样的数据框(一列有多个值,另一列只是带小数的数字):

food number
apple,tomato,melon 897.0
apple,meat,banana 984.9
banana,tomato 340.8

我想得到每种食物的平均数量。在示例中为:

以此类推,直到得到一个只有食物和平均数量的新数据框。

food average
apple 915.95
banana 662.85

我用groupby试试运气,结果全乱了:

#reshape data
df = pd.DataFrame({
    'food' : list(chain.from_iterable(df.food.tolist())), 
    'number' : df.number.repeat(df.food.str.len())
})
# groupby
df.groupby('food').number.apply(lambda x: x.unique().tolist())

我必须说原始数据框有超过 10 万行。谢谢

使用 DataFrame.explode(<column-name>) 将列表中的单个项目扩展到单独的单元格中。他们保留了原始索引,所以相应的数字被填入。从那里开始,这是一个简单的分组依据,然后是一个简单的平均值。

import pandas as pd

df = pd.DataFrame({'food': [['apple', 'tomato', 'melon'], 
                            ['apple','meat', 'banana'],
                            ['banana', 'tomato']], 
                   'number': [897, 984.9, 340.8]})

df.explode('food').groupby('food').mean()

结果

        number
food          
apple   940.95
banana  662.85
meat    984.90
melon   897.00
tomato  618.90

首先,您必须将每个单元格中的字符串列转换为列表。如果有的话,我还包括删除空格的功能。我修改自@9769953

创建的df
import pandas as pd
df = pd.DataFrame({'food': ["apple,tomato, melon", 
                            "apple,meat,banana,melon",
                            "banana, tomato, melon"], 
                   'number': [897, 984.9, 340.8]})

df['food'] = df['food'].str.split(',').apply(lambda x: [e.strip() for e in x]).tolist()
df.explode('food').groupby('food').agg('mean')

输出

如果你想要更多的聚合,你可以使用

df.explode('food').groupby('food').agg(['min', 'mean', 'max'])