Python 如果/那么聚合
我一直在寻找,但还没有找到答案。希望有人能帮助这个python新手解决我的问题 我试图弄清楚如何在python中编写if/then语句,并对该if/then语句执行聚合。我的最终目标是,如果日期=2017年1月7日,则使用“假”列中的值。如果date=all-else,则将两列求平均值 以下是我到目前为止的情况:Python 如果/那么聚合,python,pandas,numpy,aggregation,Python,Pandas,Numpy,Aggregation,我一直在寻找,但还没有找到答案。希望有人能帮助这个python新手解决我的问题 我试图弄清楚如何在python中编写if/then语句,并对该if/then语句执行聚合。我的最终目标是,如果日期=2017年1月7日,则使用“假”列中的值。如果date=all-else,则将两列求平均值 以下是我到目前为止的情况: import pandas as pd import numpy as np import datetime np.random.seed(42) dte=pd.date_range
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()
让我们使用
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
在大熊猫身上,一种方法是使用 其中有三个值: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
假设您已经计算了平均列:
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
我们也可以使用以下方法:
谢谢这些都非常有用。如果我想做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))
@P.Cummings不幸的是,你不能对熊猫数据结构使用或。您需要使用按位or的elementwise重载版本(|
)。我在帖子中添加了几个例子。谢谢。这很有帮助!
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