2017-08-14 96 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