Pandasif/then聚合

2024-05-16 22:30:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我找了这么久还没弄明白。希望有人能帮助这个新来的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(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()

Tags: importdfdatetimedateifsoasnp
3条回答

在熊猫中做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

假设您已经计算了平均列:

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操作符的元素版本(即pipe:|)。否则会引发错误。你知道吗

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

让我们使用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

相关问题 更多 >