具有多个值的 Groupby 列
Groupby column with multiple values
我有一个看起来像这样的数据框(一列有多个值,另一列只是带小数的数字):
food number
apple,tomato,melon 897.0
apple,meat,banana 984.9
banana,tomato 340.8
我想得到每种食物的平均数量。在示例中为:
- 苹果 = (897.0 + 984.9)/2 = 940.95
- 香蕉 = (984.9+340.8)/2 = 662.85
以此类推,直到得到一个只有食物和平均数量的新数据框。
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'])
我有一个看起来像这样的数据框(一列有多个值,另一列只是带小数的数字):
food number
apple,tomato,melon 897.0
apple,meat,banana 984.9
banana,tomato 340.8
我想得到每种食物的平均数量。在示例中为:
- 苹果 = (897.0 + 984.9)/2 = 940.95
- 香蕉 = (984.9+340.8)/2 = 662.85
以此类推,直到得到一个只有食物和平均数量的新数据框。
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
创建的dfimport 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'])