python-3.x - 如何在数据帧之间进行多逻辑值比较?
问题描述
我有两个这样的数据框:
df1:
Email DateTimeCompleted
2@2.com 2019-02-09T01:34:44.591Z
df2:
Email DateTimeCompleted
b@b.com 2019-01-29T01:34:44.591Z
2@2.com 2018-01-29T01:34:44.591Z
如何Email
在 df2 中查找值并比较DateTimeCompleted
大于 TODAY(减去)90 天的位置并将 df1 行数据附加到 df2 中?有时添加 df2 可以是空的,如果这会有所不同。
df2 更新看起来像这样:
Email DateTimeCompleted
b@b.com 2019-01-29T01:34:44.591Z
2@2.com 2018-01-29T01:34:44.591Z
2@2.com 2019-02-09T01:34:44.591Z
我试过这个:
from datetime import date
if df1.Email in df2.Email & df2.DateTimeCompleted >= date.today()-90 :
print('true')
我得到错误:
TypeError: 'Series' objects are mutable, thus they cannot be hashed
Also tried:
if df2.Email.str.contains(df1.Email.iat[0]):
print('true')
got error:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
解决方案
您可以执行以下操作:
1. merge
keycolumns 上的两个数据帧,Email
以便您知道哪些行包含在两个数据帧中。
2.过滤大于today - 90days
3的行。将数据框连接到finalpd.concat
代码:
# Merge dataframes together
df3 = pd.merge(df1, df2, on=['Email'], suffixes=['', '_2'])
# Filter the rows
df3 = df3[df3.DateTimeCompleted > (dt.today() - timedelta(90))]
# Drop the column we dont need
df3.drop(['DateTimeCompleted_2'], axis=1, inplace=True)
# Create final dataframe by concatting
df_final = pd.concat([df2, df3], ignore_index=True)
Email DateTimeCompleted
0 b@b.com 2019-01-29 01:34:44.591
1 2@2.com 2018-01-29 01:34:44.591
2 2@2.com 2019-02-09 01:34:44.591
推荐阅读
- webdriver-io - 如果 Webdriver.IO 测试运行失败,我如何在 shell 脚本中检测?
- python - 以给定的概率从字典中随机选择一个单词
- c - 如何使 libreadline 或 libedit 应对 SIGALRM?
- node.js - 为什么 Node.js 与浏览器不兼容?
- lambda - sympy 和 lambda() 的区别
- python - Python:`foo = object.method; foo is object.method` 返回 `False` 尽管 reprs 相同
- python - Python/BILYB/Pymultines/pymc 中贝叶斯推理的自定义可能性
- java - Spring Webflux WebClient:返回订阅()的结果?
- postgresql - 将数据从 S3 导入 RDS 时,文本列出现 NumericValueOutOfRange 错误
- c++ - Qt Creator (macOS) 中的 libsqlite 运行时错误