Python, как сопоставить фрейм данных с входным значением с 2 условным оператором - PullRequest
0 голосов
/ 22 октября 2019

Мне нужно сделать атрибуцию идентификатора для пустых полей, но я должен использовать идентификаторы из некоторого класса, чтобы выполнить это правильно.

С помощью приведенного ниже кода я смог выполнить это.

, но есть некоторые проблемы

  • 1 - у меня несколько «vendorname», поэтому мне нужно сделатьэто для всех них
  • 2 - В каждом "vendorname" есть 3 разных класса, низкий средний, ядро ​​
  • 3 - Я не знаю, как получить всю эту кампанию, в сочетании с оригиналомДатафрейм в конце.
cw:

 lead_date  vendorname  captureurl      campaignid
2019-10-01       Google     Lib_Core_HAS        0000000001
2019-10-01       Google     Lib_Core_Generic    Nan
2019-10-01       Google     Lib_Core_Bagde      Nan
2019-10-01       Google     Lib_Core_Generic    Nan
2019-10-01       Google     Lib_Core_Generic    0000000001
2019-10-01       Google     Medium_Generic      0000000002
2019-10-01       Google     Medium_Generic      Nan
2019-10-01       Google     Medium_Generic      Nan
2019-10-01       Google     rt:Low_Generic      0000000003
2019-10-01      Facebook    Lib_Core_Generic    0000000004
2019-10-01      Facebook    Lib_Core_Generic    Nan
2019-10-01      Facebook    Lib_Core_Generic    0000000005


Мой подход:

  • Я собрал все записи, содержащие «google»
  • Затем схватил все, содержащие «Core»
  • Затем укажите идентификатор, соответствующий этой записи
# for Core at google

google = cw[cw.vendorname.str.contains('Google')]

x = google[google.captureurl.str.contains('Core')]

x.campaignid = x.campaignid.fillna("0000000001")


Ожидаемый результат

 lead_date  vendorname  captureurl      campaignid
2019-10-01       Google     Lib_Core_HAS        0000000001
2019-10-01       Google     Lib_Core_Generic    0000000001
2019-10-01       Google     Lib_Core_Bagde      0000000001
2019-10-01       Google     Lib_Core_Generic    0000000001
2019-10-01       Google     Lib_Core_Generic    0000000001
2019-10-01       Google     Medium_Generic      0000000002
2019-10-01       Google     Medium_Generic      0000000002
2019-10-01       Google     Medium_Generic      0000000002
2019-10-01       Google     rt:Low_Generic      0000000003
2019-10-01      Facebook    Lib_Core_Generic    0000000004
2019-10-01      Facebook    Lib_Core_Generic    0000000005
2019-10-01      Facebook    Lib_Core_Generic    0000000005

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Я думаю, вы хотите ffill в Google и Facebook bffill

#df.campaignid=df.campaignid.replace('Nan',np.nan)
df= ( df.groupby('vendorname',sort=False) 
     .apply(lambda x: x.ffill().where(x['vendorname'].str.contains('Google'),x.bfill()))
    )
print(df)

     lead_date vendorname        captureurl  campaignid
0   2019-10-01     Google      Lib_Core_HAS  0000000001
1   2019-10-01     Google  Lib_Core_Generic  0000000001
2   2019-10-01     Google    Lib_Core_Bagde  0000000001
3   2019-10-01     Google  Lib_Core_Generic  0000000001
4   2019-10-01     Google  Lib_Core_Generic  0000000001
5   2019-10-01     Google    Medium_Generic  0000000002
6   2019-10-01     Google    Medium_Generic  0000000002
7   2019-10-01     Google    Medium_Generic  0000000002
8   2019-10-01     Google    rt:Low_Generic  0000000003
9   2019-10-01   Facebook  Lib_Core_Generic  0000000004
10  2019-10-01   Facebook  Lib_Core_Generic  0000000005
11  2019-10-01   Facebook  Lib_Core_Generic  0000000005
1 голос
/ 22 октября 2019

Это должно работать:

import numpy as np 
import pandas as pd

google = cw[cw['vendorname']=='Google']

x = google[google['captureurl'].str.contains('Core')]
x['campaignid'].fillna('0000000001', inplace = True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...