python - Pandas if/then 聚合

标签 python pandas numpy aggregation

我一直在搜索,但还没有弄清楚。希望有人能帮助这个 python 新手解决我的问题。

我正在尝试弄清楚如何在 python 中编写 if/then 语句并根据该 if/then 语句执行聚合。我的最终目标是说如果日期 = 1/7/2017 然后使用“假”列中的值。如果 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()

最佳答案

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

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

关于python - Pandas if/then 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45682596/

相关文章:

python - 转换 Pandas DataFrame 中列值的最有效方法

python - Python 中变量后面的逗号 ","是什么意思?

python sqlalchemy bulk_save_objects 不使用批量

Python Pandas csv import "Error tokenizing data"- 显示错误行内容

python - 带字符串的 Pandas "diff()"

python - 是否可以关闭内存映射的临时文件而不刷新其内容?

python - 以其他维度的关联值为条件对 3d numpy 数组的分配进行矢量化

python - 在 pandas.DataFrame 的对角线上设置值

python - HTML 中字符串的路径

python - spacy 与 joblib 库生成 _pickle.PicklingError : Could not pickle the task to send it to the workers