изменить значения в объекте groupby с мультииндексом - PullRequest
0 голосов
/ 17 июня 2020

У меня есть следующий df, который я группирую, а затем пытаюсь изменить значения US с общей суммой для каждого типа, но я получаю nan:

dff=pd.DataFrame({'country':['US','US','UK','UK','FR','FR','ES','ES'],'type':['A','B','C','B','A','C','A','B'],'sales':[100,200,100,100,50,10,20,40]})

grouped=dff.groupby(['country','type'])['sales'].sum()

grouped['US']=dff.loc[dff.country!='US'].groupby('type')['sales'].sum()

print(grouped)

enter image description here

А я хочу получить:

US   A   70

US   B   140

Ответы [ 3 ]

1 голос
/ 17 июня 2020

Когда вы звоните

dff.loc[dff.country != 'US'].groupby('type')['sales'].sum()

, вы получаете 3 значения

type
A     70
B    140
C    110
Name: sales, dtype: int64

Но

grouped["US"]

имеет только 2 значения

type
A     70
B    140
Name: sales, dtype: int64

Вы можете попробовать:

dff.loc[dff.country != 'US'].groupby('type')['sales'].sum()[["A", "B"]]
type
A     70
B    140
Name: sales, dtype: int64
1 голос
/ 17 июня 2020

Мы можем использовать pivot для присвоения значений US:

dff=pd.DataFrame({'country':['US','US','UK','UK','FR','FR','ES','ES'],'type':['A','B','C','B','A','C','A','B'],'sales':[100,200,100,100,50,10,20,40]})

#use as_index=False to keep group keys within the dataframe
grouped=dff.groupby(['country','type'],as_index=False)['sales'].sum()

grouped.loc[lambda x: x.country.eq("US"), "sales"] = (grouped
                                                       #filter out US
                                                       #and search for A and B in the type column
                                                      .query("country != 'US' and type in ['A','B']")
                                                      .pivot(columns='type',values='sales')
                                                      .sum()
                                                      .array)

grouped

    country type    sales
0     ES    A        20
1     ES    B        40
2     FR    A        50
3     FR    C        10
4     UK    B        100
5     UK    C        100
6     US    A        70
7     US    B        140
1 голос
/ 17 июня 2020

Создать MultiIndex с помощью MultiIndex.from_product для назначения серии на уровень US:

s = dff.loc[dff.country!='US'].groupby('type')['sales'].sum()
s.index = pd.MultiIndex.from_product([['US'], s.index])
grouped['US'] = s

print (grouped)
country  type
ES       A        20
         B        40
FR       A        50
         C        10
UK       B       100
         C       100
US       A        70
         B       140
Name: sales, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...