Pandas groupby 和聚合:为某些单元格生成唯一的单个值
Pandas groupby and aggregate: produce unique single values for some cells
全部,
我有以下 pd.DataFrame():
df = pd.DataFrame({'fruit': ['carrot','carrot','apple','apple', 'tomato'],
'taste': ['sweet','sweet','sweet','bitter','bitter'],
'quality': ['good','poor','rotten','good','good']})
看起来像这样:
fruit taste quality
0 carrot sweet good
1 carrot sweet poor
2 apple sweet rotten
3 apple bitter good
4 tomato bitter good
我这样应用 grouby 和 agg:
df.groupby('fruit').agg(pd.Series.tolist)
生产:
taste quality
fruit
apple [sweet, bitter] [rotten, good]
carrot [sweet, sweet] [good, poor]
tomato [bitter] [good]
但我想要的是:
taste quality
fruit
apple [sweet, bitter] [rotten, good]
carrot sweet [good, poor]
tomato bitter good
换句话说:我只想聚合具有多个不同值的条目,但是当列表只包含相同的唯一项目时,我希望它只包含所述项目。有没有一种很好的方法(最好不要遍历 df 的所有单元格,我的相当大,但也许这是唯一的方法?)?抱歉,如果我不清楚,我很难用语言表达这一点(因此标题也很困难)。
提前致谢。
使用自定义 lambda 函数通过 set
删除重复项并将唯一值转换为标量:
f = lambda x: list(set(x)) if len(set(x)) > 1 else x.iat[0]
df = df.groupby('fruit').agg(f)
print (df)
taste quality
fruit
apple [sweet, bitter] [rotten, good]
carrot sweet [poor, good]
tomato bitter good
如果顺序很重要:
f = lambda x: list(dict.fromkeys(x)) if len(set(x)) > 1 else x.iat[0]
df = df.groupby('fruit').agg(f)
print (df)
taste quality
fruit
apple [sweet, bitter] [rotten, good]
carrot sweet [good, poor]
tomato bitter good
全部,
我有以下 pd.DataFrame():
df = pd.DataFrame({'fruit': ['carrot','carrot','apple','apple', 'tomato'],
'taste': ['sweet','sweet','sweet','bitter','bitter'],
'quality': ['good','poor','rotten','good','good']})
看起来像这样:
fruit taste quality
0 carrot sweet good
1 carrot sweet poor
2 apple sweet rotten
3 apple bitter good
4 tomato bitter good
我这样应用 grouby 和 agg:
df.groupby('fruit').agg(pd.Series.tolist)
生产:
taste quality
fruit
apple [sweet, bitter] [rotten, good]
carrot [sweet, sweet] [good, poor]
tomato [bitter] [good]
但我想要的是:
taste quality
fruit
apple [sweet, bitter] [rotten, good]
carrot sweet [good, poor]
tomato bitter good
换句话说:我只想聚合具有多个不同值的条目,但是当列表只包含相同的唯一项目时,我希望它只包含所述项目。有没有一种很好的方法(最好不要遍历 df 的所有单元格,我的相当大,但也许这是唯一的方法?)?抱歉,如果我不清楚,我很难用语言表达这一点(因此标题也很困难)。
提前致谢。
使用自定义 lambda 函数通过 set
删除重复项并将唯一值转换为标量:
f = lambda x: list(set(x)) if len(set(x)) > 1 else x.iat[0]
df = df.groupby('fruit').agg(f)
print (df)
taste quality
fruit
apple [sweet, bitter] [rotten, good]
carrot sweet [poor, good]
tomato bitter good
如果顺序很重要:
f = lambda x: list(dict.fromkeys(x)) if len(set(x)) > 1 else x.iat[0]
df = df.groupby('fruit').agg(f)
print (df)
taste quality
fruit
apple [sweet, bitter] [rotten, good]
carrot sweet [good, poor]
tomato bitter good