我希望在以下方面获得帮助:
我在下面有一个给定的df:
df
fruit State Count
apples CA 45
apples VT 54
apples MI 18
pears TX 20
pears AZ 89
plums NV 62
plums ID 10
我对每个州的每种水果进行了最高计数,并且能够得到类似的东西:
df2
fruit State Count
apples VT 54
pears AZ 89
plums NV 62
现在,我试图弄清楚如何从df2中获取“状态”值作为df中的新列,如下所示:
df
fruit State Count Main
apples CA 45 VT
apples VT 54 VT
apples MI 18 VT
pears TX 20 AZ
pears AZ 89 AZ
plums NV 62 NV
plums ID 10 NV
我可以使用.transform()函数执行类似的操作,但是我只知道在调用max函数时如何执行此操作。我可以在df ['list']上运行转换吗?还是我在这里想念其他东西?
答案 0 :(得分:2)
两步:-)不使用groupby
df2=df.sort_values('Count').drop_duplicates('fruit',keep='last')
df['new']=df.fruit.map(df2.set_index('fruit').State)
df
Out[240]:
fruit State Count new
0 apples CA 45 VT
1 apples VT 54 VT
2 apples MI 18 VT
3 pears TX 20 AZ
4 pears AZ 89 AZ
5 plums NV 62 NV
6 plums ID 10 NV
答案 1 :(得分:1)
使用GroupBy.transform
的DataFrameGroupBy.idxmax
,但首先需要set_index
来获取第State
列的索引:
df['new'] = df.set_index('State').groupby('fruit')['Count'].transform('idxmax').values
print (df)
fruit State Count new
0 apples CA 45 VT
1 apples VT 54 VT
2 apples MI 18 VT
3 pears TX 20 AZ
4 pears AZ 89 AZ
5 plums NV 62 NV
6 plums ID 10 NV
此Series
为sort_values
使用drop_duplicates
,set_index
和map
的另一种解决方案:
s = (df.sort_values('Count', ascending= False)
.drop_duplicates('fruit')
.set_index('fruit')['State'])
print (s)
fruit
pears AZ
plums NV
apples VT
Name: State, dtype: object
df['new'] = df['fruit'].map(s)
print (df)
fruit State Count new
0 apples CA 45 VT
1 apples VT 54 VT
2 apples MI 18 VT
3 pears TX 20 AZ
4 pears AZ 89 AZ
5 plums NV 62 NV
6 plums ID 10 NV