2017-08-14 2 views
2

1行に2つの異なる条件を適用する方法python pandas code?次の表によると

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']は作成された新しい列です。では、上記のコードを1行のコードでどのように組み合わせるのですか?

+0

答えにかかわらず、ほとんど理解できないコード行に終わるでしょう。なぜ2本の線を結合したいのですか? – DyZ

+0

上記の2行のコードを使用すると、顧客がGoogle以外の行に移動する –

+0

Google以外の行を維持したいので、私はそれを組み合わせる予定です –

答えて

2

私はあなたが最初にフィルタリングして、あまりにもフィルター列に出力を追加する必要があると思う:

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 

そして、1行のソリューションのために:

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 
+1

再チェック、私のソリューションは間違っています。 –

1

インセットを計算して元のデータフレームに貼り付けることができます。不器用ですが、違います。

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 
1
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 
関連する問題