首页 > 解决方案 > 附加两个数据帧,带有一些重复的 datetime.date 索引,选择一个数据帧而不是另一个数据帧,使用矢量化

问题描述

我有两个带有 datetime.date 索引的熊猫数据框。某些索引可能会重复。我想使用 df1 中的所有行,并且只使用 df2 中不在 df1 中的行来创建 df3。df3 必须保留日期索引。

示例数据框:

import numpy as np
import pandas as pd

np.random.seed(100)

dates1 = pd.date_range('2020-01-01', periods=8)
df1 = pd.DataFrame(np.random.randn(8, 1), columns=['A'], index=dates1)
print('df1:')
print(df1)

df1:
                   A
2020-01-01 -1.749765
2020-01-02  0.342680
2020-01-03  1.153036
2020-01-04 -0.252436
2020-01-05  0.981321
2020-01-06  0.514219
2020-01-07  0.221180
2020-01-08 -1.070043

dates2 = pd.date_range('2020-01-06', periods=5)
df2 = pd.DataFrame(np.random.randn(5, 1), columns=['A'], index=dates2)
print('\ndf2:')
print(df2)

df2:
                   A
2020-01-06 -0.189496
2020-01-07  0.255001
2020-01-08 -0.458027
2020-01-09  0.435163
2020-01-10 -0.583595

我可以通过迭代(绝对慢)和列表理解(更快)来解决这个问题,但我不知道如何通过矢量化来解决这个问题。根据@cs95对这个问题的回答,最快的方法是:

  1. 矢量化
  2. Cython 例程
  3. 列表理解(vanilla for 循环)
  4. DataFrame.apply():i)可以在 cython 中执行的缩减,ii)python 空间中的迭代
  5. DataFrame.itertuples() 和 iteritems()
  6. DataFrame.iterrows()

使用列表推导解决此问题的代码是:

# Solution with list comprehension
new_rows = [x not in df1.index.values for x in df2.index.values]
df3 = df1.append(df2.loc[new_rows], verify_integrity=True)
print('\ndf3:')
print(df3)
df3:
                   A
2020-01-01 -1.749765
2020-01-02  0.342680
2020-01-03  1.153036
2020-01-04 -0.252436
2020-01-05  0.981321
2020-01-06  0.514219
2020-01-07  0.221180
2020-01-08 -1.070043
2020-01-09  0.435163
2020-01-10 -0.583595

如您所见,df3 采用 df1 值超过 df2,但在 df1 中没有值时采用 df2 值(这是预期的行为)。

有没有办法通过矢量化来做到这一点?谢谢!

标签: pythonpython-3.xpandasvectorization

解决方案


推荐阅读