Как применить условия к pandas столбцам данных? - PullRequest
1 голос
/ 17 марта 2020

У меня есть pandas фрейм данных, в котором есть информация об отклонениях. Немного предыстории проблемы: отправитель электронной почты может отправлять одно и то же письмо несколько раз, но это разрешается только один раз. Я хочу по-прежнему учитывать сообщения электронной почты с тем же отправителем и тем же сообщением, что и «решено», в новом столбце.

Начальный фрейм данных выглядит следующим образом:

data = [['Sent from automated email', 'jim@yahoo.com', 'Resolved','2020-01-13 07:06:34'], 
        ['Sent from automated email', 'jim@yahoo.com', 'Rejected','2020-01-13 07:06:39'], 
        ['Hello I would like for you to make an update please','new101@cnn.com', 'Resolved', '2020-02-14 09:06:39'], 
        ['Hello I would like for you to make an update please','new101@cnn.com', 'Rejected', '2020-02-14 09:06:41'],
        ['Hello I would like for you to make an update please','new101@cnn.com', 'Resolved', '2020-02-14 09:06:59'],
        ['Take one newspaper','notneeded@gmail.com', 'Resolved', '2020-02-17 09:05:39'],
        ['Hey hows it going','jamie@gmail.com', 'Rejected', '2020-03-12 09:03:42'],
        ] 

# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['Message', 'Email','Resolution','Time Sent']) 

Я хочу взять все письма, которые имеют одного и того же отправителя и одно и то же сообщение, но разные разрешения и пометить их как «разрешенные», если любые из предыдущих писем были разрешены. Мой желаемый результат будет:

data = [['Sent from automated email', 'jim@yahoo.com', 'Resolved','2020-01-13 07:06:34','Resolved' ], 
        ['Sent from automated email', 'jim@yahoo.com', 'Rejected','2020-01-13 07:06:39','Resolved'], 
        ['Hello I would like for you to make an update please','new101@cnn.com', 'Resolved', '2020-02-14 09:06:39','Resolved'], 
        ['Hello I would like for you to make an update please','new101@cnn.com', 'Rejected', '2020-02-14 09:06:41','Resolved'],
        ['Hello I would like for you to make an update please','new101@cnn.com', 'Resolved', '2020-02-14 09:06:59','Resolved'],
        ] 

# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['Message', 'Email','Resolution','Time Sent','Real Resolution']) 

Я попытался написать функцию, как показано ниже:

    def a(df):
        if df[df['message'].duplicated()] & df[(df['resolution'] == 'Rejected') | (df['resolution'] == 'Resolved') ] & df[df['Email].duplicated()]:
           df['Real Resolution'] = 'Resolved' 

df['Real Resolution'] = df.apply(a)

Я не думаю, что это правильно, так как я не учитываю только дублированные сообщения которые разрешены, а затем отклонены. Какие-нибудь советы? Спасибо!

1 Ответ

1 голос
/ 17 марта 2020

IIU C, вы можете попробовать следующее:

c = df[['Message','Email']].duplicated(keep=False) #check duplicate in Message+Email
c1 = df[['Message','Email','Resolution']].duplicated(keep=False) #check resolution too
#condition is if c is True and c1 is False then check if email group has any True
df.loc[(c & ~c1).groupby(df['Email']).transform('any'),'Real Resolution'] = 'Resolved'

out = df.dropna(subset=['Real Resolution']).copy()
print(out)

                                             Message           Email  \
0                          Sent from automated email   jim@yahoo.com   
1                          Sent from automated email   jim@yahoo.com   
2  Hello I would like for you to make an update p...  new101@cnn.com   
3  Hello I would like for you to make an update p...  new101@cnn.com   
4  Hello I would like for you to make an update p...  new101@cnn.com   

  Resolution            Time Sent Real Resolution  
0   Resolved  2020-01-13 07:06:34        Resolved  
1   Rejected  2020-01-13 07:06:39        Resolved  
2   Resolved  2020-02-14 09:06:39        Resolved  
3   Rejected  2020-02-14 09:06:41        Resolved  
4   Resolved  2020-02-14 09:06:59        Resolved  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...