首页 > 解决方案 > 如何在数据帧之间进行多逻辑值比较?

问题描述

我有两个这样的数据框:

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().

标签: python-3.xpandasdataframe

解决方案


您可以执行以下操作:
1. mergekeycolumns 上的两个数据帧,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

推荐阅读