python - 附加两个数据帧,带有一些重复的 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对这个问题的回答,最快的方法是:
- 矢量化
- Cython 例程
- 列表理解(vanilla for 循环)
- DataFrame.apply():i)可以在 cython 中执行的缩减,ii)python 空间中的迭代
- DataFrame.itertuples() 和 iteritems()
- 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 值(这是预期的行为)。
有没有办法通过矢量化来做到这一点?谢谢!
解决方案
推荐阅读
- ruby - Github Pages 上的 Jekyll 设置,捆绑安装的问题
- python - 使用带有 Pathlib 父母方法的负索引
- angular - Angular 实例化 EntryComponent 会创建新服务
- r - R:使用 rbind 时重新打印列标题
- sql - Oracle:单个列的 2 个列名
- database - 如何在同一查询中检索用户的关注者和我已经在 mongodb 中关注的用户
- vim - 为什么复制代码后我的VIM中出现了许多不必要的注释符号//?
- mobile - 渐变容器在移动设备上破坏
- java - 在 Xamarin.Android 应用程序中运行 Java Android 应用程序
- azure - SQL Azure 和 CDN