Как сделать мульти логическое сравнение значений между фреймами данных? - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть два кадра данных, например:

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 больше СЕГОДНЯ (минус) 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().

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Я написал функцию для выполнения следующих действий:

Функция принимает аргумент

mailid, dataframe1, dataframe2

def process(mailid,df1,df2):
    if mailid in df2.Email.values:
        b = df1.loc[df1.Email==mailid,"DateTimeCompleted"].head(1)
        if((~b.empty) or (int(((pd.to_datetime('today'))-(pd.to_datetime(b))).astype('timedelta64[D]')) >90)):
            df1 = pd.concat([df1, pd.DataFrame([[mailid,b[0]]],columns=['Email','DateTimeCompleted'])],axis=0)
            print("Added the row")
        else:
            print("Condition failed")
            print("False")
    else:
        print("The mail is not there in dataframe")
    return df1
0 голосов
/ 09 февраля 2019

Вы можете сделать следующее:
1. merge два кадра данных в ключевых столбцах Email, чтобы вы знали, какие строки состоят в обоих кадрах.
2. Отфильтруйте строки, которые больше today - 90days
3. Конвертируйте кадры данных в финал с pd.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...