将列表从一个数据框扩展到另一个数据框熊猫

时间:2018-06-30 16:05:14

标签: python list pandas dataframe expand

我希望在以下方面获得帮助:

我在下面有一个给定的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']上运行转换吗?还是我在这里想念其他东西?

2 个答案:

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

Seriessort_values使用drop_duplicatesset_indexmap的另一种解决方案:

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