如何在一行 python pandas 代码中应用 2 个不同的条件?

How to apply 2 different condition in a single line python pandas code?

根据以下table:

FamilyVsWWTotal = pd.DataFrame({'date':['2011-4-3','2011-3-5','2011-4-3','2011-5-7'], 'Country':['USA','CAN','USA','MEX'],'Revenues':[1200,1800,1000,800],'Customer':['Exxon','Google','Google','Microsoft']})

FamilyVsWWTotal = FamilyVsWWTotal.loc[FamilyVsWWTotal['Customer'] == 'Google']
FamilyVsWWTotal['total1'] = FamilyVsWWTotal.groupby(['date','Country'])['Revenues']\
                                           .transform('sum')

FamilyVsWWTotal['total1'] 是一个新创建的专栏。那么,如何将上面的代码组合成一行代码呢?

您可以计算一个插图并将其粘贴到原始数据框中。笨拙,但不同。

rows = FamilyVsWWTotal['Customer'] == 'Google'
inset = FamilyVsWWTotal[rows].groupby(['date', 'Country'])['Revenues'].sum()
FamilyVsWWTotal.set_index(['date', 'Country'], inplace=True)
rows = FamilyVsWWTotal['Customer'] == 'Google'
FamilyVsWWTotal.loc[rows,'total1'] = inset
FamilyVsWWTotal.reset_index(inplace = True)

#       date Country   Customer  Revenues  total1
#0  2011-4-3     USA      Exxon      1200     NaN
#1  2011-3-5     CAN     Google      1800  1800.0
#2  2011-4-3     USA     Google      1000  1000.0
#3  2011-5-7     MEX  Microsoft       800     NaN

我认为您需要先进行筛选,然后再将输出添加到已筛选的列中:

m = FamilyVsWWTotal['Customer'] == 'Google'

FamilyVsWWTotal.loc[m, 'total1']=FamilyVsWWTotal[m].groupby(['date','Country'])['Revenues']\
                                                   .transform('sum')

print (FamilyVsWWTotal)
  Country   Customer  Revenues      date  total1
0     USA      Exxon      1200  2011-4-3     NaN
1     CAN     Google      1800  2011-3-5  1800.0
2     USA     Google      1000  2011-4-3  1000.0
3     MEX  Microsoft       800  2011-5-7     NaN

对于一行解决方案:

FamilyVsWWTotal.loc[FamilyVsWWTotal['Customer'] == 'Google', 'total1'] = \
FamilyVsWWTotal[FamilyVsWWTotal['Customer']=='Google'].groupby(['date','Country'])['Revenues']\
                                                      .transform('sum')

print (FamilyVsWWTotal)
  Country   Customer  Revenues      date  total1
0     USA      Exxon      1200  2011-4-3     NaN
1     CAN     Google      1800  2011-3-5  1800.0
2     USA     Google      1000  2011-4-3  1000.0
3     MEX  Microsoft       800  2011-5-7     NaN
FamilyVsWWTotal.assign(total1=FamilyVsWWTotal[FamilyVsWWTotal.Customer.eq('Google')].groupby(['date', 'Country']).Revenues.transform('sum'))

  Country   Customer  Revenues      date  total1
0     USA      Exxon      1200  2011-4-3     NaN
1     CAN     Google      1800  2011-3-5  1800.0
2     USA     Google      1000  2011-4-3  1000.0
3     MEX  Microsoft       800  2011-5-7     NaN

同样的事情,但打破了排队

FamilyVsWWTotal.assign(
    total1=FamilyVsWWTotal[FamilyVsWWTotal.Customer.eq('Google')].groupby(
        ['date', 'Country']
    ).Revenues.transform('sum')
)

  Country   Customer  Revenues      date  total1
0     USA      Exxon      1200  2011-4-3     NaN
1     CAN     Google      1800  2011-3-5  1800.0
2     USA     Google      1000  2011-4-3  1000.0
3     MEX  Microsoft       800  2011-5-7     NaN