2017-08-14 73 views
3

我一直在搜索,所以還沒有想通了。希望有人能幫助這個python newb來解決我的問題。熊貓如果/然後聚合

我想弄清楚如何在python中編寫一個if/then語句,並執行一個聚合關閉if/then語句。我的最終目標是說明日期= 2017年1月7日,然後使用「假」列中的值。如果日期=全部,則將兩列平均。

這是我到目前爲止有:

import pandas as pd 
import numpy as np 
import datetime 

np.random.seed(42) 
dte=pd.date_range(start=datetime.date(2017,1,1), end= datetime.date(2017,1,15)) 
fake=np.random.randint(15,100, size=15) 
fake2=np.random.randint(300,1000,size=15) 

so_df=pd.DataFrame({'date':dte, 
      'fake':fake, 
      'fake2':fake2}) 

so_df['avg']= so_df[['fake','fake2']].mean(axis=1) 
so_df.head() 

回答

2

假設您已經計算出的平均柱:

so_df['fake'].where(so_df['date']=='20170107', so_df['avg']) 
Out: 
0  375.5 
1  260.0 
2  331.0 
3  267.5 
4  397.0 
5  355.0 
6  89.0 
7  320.5 
8  449.0 
9  395.5 
10 197.0 
11 438.5 
12 498.5 
13 409.5 
14 525.5 
Name: fake, dtype: float64 

如果沒有,你可以用同樣的計算代替列引用:

so_df['fake'].where(so_df['date']=='20170107', so_df[['fake','fake2']].mean(axis=1)) 

要檢查多個日期,您需要使用or運算符的元素版本(管道:|)。否則會引發錯誤。

so_df['fake'].where((so_df['date']=='20170107') | (so_df['date']=='20170109'), so_df['avg']) 

以上檢查兩個日期。在3個或更多的情況下,你可能想使用isin一個列表:

so_df['fake'].where(so_df['date'].isin(['20170107', '20170109', '20170112']), so_df['avg']) 
Out[42]: 
0  375.5 
1  260.0 
2  331.0 
3  267.5 
4  397.0 
5  355.0 
6  89.0 
7  320.5 
8  38.0 
9  395.5 
10 197.0 
11  67.0 
12 498.5 
13 409.5 
14 525.5 
Name: fake, dtype: float64 
+0

謝謝!這些都是超級有用的。如果我想要做1個以上的日期,即1/7,1/9和1/11,我可以簡單地寫成: 'so_df ['fake']。where((so_df ['date'] =='20170107 ')或(so_df ['date'] =='20170105')或(so_df ['date'] =='20170111'),so_df [['fake','fake2']]。mean(axis = 1) )' –

+0

@ P.Cummings不幸的是,你不能使用'or'作爲熊貓數據結構。您需要使用按位或('|')的元素重載版本。我在帖子中增加了幾個例子。 – ayhan

+1

謝謝。這非常有幫助! –

1

讓我們使用np.where

so_df['avg'] = np.where(so_df['date'] == pd.to_datetime('2017-01-07'), 
         so_df['fake'], so_df[['fake', 
         'fake2']].mean(1)) 

輸出:

  date fake fake2 avg 
0 2017-01-01 66 685 375.5 
1 2017-01-02 29 491 260.0 
2 2017-01-03 86 576 331.0 
3 2017-01-04 75 460 267.5 
4 2017-01-05 35 759 397.0 
5 2017-01-06 97 613 355.0 
6 2017-01-07 89 321 89.0 
7 2017-01-08 89 552 320.5 
8 2017-01-09 38 860 449.0 
9 2017-01-10 17 774 395.5 
10 2017-01-11 36 358 197.0 
11 2017-01-12 67 810 438.5 
12 2017-01-13 16 981 498.5 
13 2017-01-14 44 775 409.5 
14 2017-01-15 52 999 525.5 
1

一種方法做的if-else在大熊貓是使用np.where 裏面有三個值,condition,if和else

so_df['avg']= np.where(so_df['date'] == '2017-01-07',so_df['fake'],so_df[['fake','fake2']].mean(axis=1)) 

    date  fake fake2 avg 
0 2017-01-01 66  685 375.5 
1 2017-01-02 29  491 260.0 
2 2017-01-03 86  576 331.0 
3 2017-01-04 75  460 267.5 
4 2017-01-05 35  759 397.0 
5 2017-01-06 97  613 355.0 
6 2017-01-07 89  321 89.0 
7 2017-01-08 89  552 320.5 
8 2017-01-09 38  860 449.0 
9 2017-01-10 17  774 395.5 
10 2017-01-11 36  358 197.0 
11 2017-01-12 67  810 438.5 
12 2017-01-13 16  981 498.5 
13 2017-01-14 44  775 409.5 
14 2017-01-15 52  999 525.5 
0

我們還可以使用Series.where()方法:

In [141]: so_df['avg'] = so_df['fake'] \ 
    ...:     .where(so_df['date'].isin(['2017-01-07','2017-01-09'])) 
    ...:     .fillna(so_df[['fake','fake2']].mean(1)) 
    ...: 

In [142]: so_df 
Out[142]: 
     date fake fake2 avg 
0 2017-01-01 66 685 375.5 
1 2017-01-02 29 491 260.0 
2 2017-01-03 86 576 331.0 
3 2017-01-04 75 460 267.5 
4 2017-01-05 35 759 397.0 
5 2017-01-06 97 613 355.0 
6 2017-01-07 89 321 89.0 
7 2017-01-08 89 552 320.5 
8 2017-01-09 38 860 38.0 
9 2017-01-10 17 774 395.5 
10 2017-01-11 36 358 197.0 
11 2017-01-12 67 810 438.5 
12 2017-01-13 16 981 498.5 
13 2017-01-14 44 775 409.5 
14 2017-01-15 52 999 525.5