python - 根据日期 Pandas 有效地创建行

标签 python pandas

目前我有一系列正在创建的列,其中包含一个基于我正在使用的 Dataframe 中的日期的 bool 值

df['bool1'] = [1 if x > pd.to_datetime('20190731') else 0 for x in df['date']]

df['bool2'] = [1 if x > pd.to_datetime('20190803') else 0 for x in df['date']]

df['bool3'] = [1 if x > pd.to_datetime('20190813') else 0 for x in df['date']]

我认为像这样的列表理解是解决问题的一种 pythonic 方式。我觉得我的代码非常清楚它在做什么,有人可以很容易地理解它。

例如为 {bool1:'20190731'} 创建一个字典然后循环遍历 Key:Value 对,这样我就不会重复这行代码,这是一个潜在的改进。但这只会减少行数,同时增加可读性和可扩展性。它实际上不会让我的代码运行得更快。

但是我的问题是这段代码实际上运行起来很慢。我应该使用 lambda 函数来加速吗?编写此代码最快的方法是什么?

最佳答案

我认为带有比较值的新列字典是个好主意。

d = {'bool1':'20190731', 'bool2':'20190803', 'bool3':'20190813'}

然后可以在循环中创建新列:

for k, v in d.items():
    df[k] = (df['date'] > pd.to_datetime(v)).astype(int)
    #alternative
    #df[k] = np.where(df['date'] > pd.to_datetime(v), 1, 0)

为了提高性能,请在 numpy 中使用广播:

rng = pd.date_range('20190731', periods=20)
df = pd.DataFrame({'date': rng})  

d = {'bool1':'20190731', 'bool2':'20190803', 'bool3':'20190813'}

#pandas 0.24+
mask = df['date'].to_numpy()[:, None] > pd.to_datetime(list(d.values())).to_numpy()
#pandas below
#mask = df['date'].values[:, None] > pd.to_datetime(list(d.values())).values
arr = np.where(mask, 1, 0)

df = df.join(pd.DataFrame(arr, columns=d.keys()))
print (df)
         date  bool1  bool2  bool3
0  2019-07-31      0      0      0
1  2019-08-01      1      0      0
2  2019-08-02      1      0      0
3  2019-08-03      1      0      0
4  2019-08-04      1      1      0
5  2019-08-05      1      1      0
6  2019-08-06      1      1      0
7  2019-08-07      1      1      0
8  2019-08-08      1      1      0
9  2019-08-09      1      1      0
10 2019-08-10      1      1      0
11 2019-08-11      1      1      0
12 2019-08-12      1      1      0
13 2019-08-13      1      1      0
14 2019-08-14      1      1      1
15 2019-08-15      1      1      1
16 2019-08-16      1      1      1
17 2019-08-17      1      1      1
18 2019-08-18      1      1      1
19 2019-08-19      1      1      1

关于python - 根据日期 Pandas 有效地创建行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57802939/

相关文章:

python - 如何有效地删除python中数据帧或csv文件中的所有重复项?

python - Flask-Sqlalchemy:具有 3 个主键同时也是外键的表

python - 计算值并将值放入 M​​ultiIndex Pandas DataFrame 的二级列中

python - 如何通过tree.plot_tree设置 TreeView 中的列名?

python - 在 django rest 框架中对 pandas DataFrame 重复操作

python - 按分类变量分组的箱线图

python - 使用python比较2个excel文件

Python 产量与 Ruby 产量

python - 使用多列同时将字典映射到数据框

python - 数据框组合