как добавить столбец и заполнить его значениями по условиям между двумя фреймами данных в python - PullRequest
0 голосов
/ 10 июля 2020

У меня есть 2 следующих набора данных:

Индивидуальные данные

   household_id     member_id   channel  event_begin    event_end
0   1                  1          100      83098          83300
1   1                  2          100      83150          83600
2   1                  1          200      83700          83865
3   1                  2          200      83931          83963
4   1                  3          200      84367          84532
5   1                  4          450      84598          84721
6   2                  1          300      83841          83906
7   2                  2          300      78219          78500

Домашние данные

    household_id    channel    Begin     End
  0     1             100      83098    83600
  1     1             200      84367    84532
  2     2             300      83841    83906
  3     2             300      78219    78452

Я хочу добавить столбец в Individual data как ['FS_NFS'], если Household data имеет такой же домашний_идентификатор и канал, что и в индивидуальных данных (т.е. индивидуальные и семейные данные имеют одинаковый идентификатор = (домашний_ид и канал))

Теперь я хочу поместите 'FS' в столбец 'FS_NFS' в Individual Data, если следующее условие удовлетворяет

(indv['event_begin']>=HH['Begin']) & (indv['event_end']<=HH['End']) & 
       (indv['household_id']==HH['household_id']) & (indv['channel']==HH['channel'])

иначе Я хочу 'NFS' в столбце 'FS_NFS' в Individual data

Ожидаемый выход:

   household_id     member_id   channel  event_begin    event_end  FS_NFS
0   1                  1          100      83098          83300      FS
1   1                  2          100      83150          83600      FS
2   1                  1          200      83700          83865      NFS 
3   1                  2          200      83931          83963      NFS 
4   1                  3          200      84367          84532      FS
5   1                  4          450      84598          84721      NFS (Channel not prsent in both)
6   2                  1          300      83841          83906      FS
7   2                  2          300      78219          78500      NFS

Ответы [ 2 ]

0 голосов
/ 10 июля 2020
HH.columns=['household_id','channel','HH_event_Begin','HH_event_End']
merged=pd.merge(indv,HH,on=['household_id','channel'],how='left')

merged['event_begin']=merged['event_begin'].astype(float)#.inplace=True
merged['event_end']=merged['event_end'].astype(float)#.inplace=True
merged['FSNFSNew']=''
i=0
length=len(merged)-1
while i<=length:
    if (merged['event_begin'][i]>=merged['HH_event_Begin'][i])&(merged['event_end'][i]<=merged['HH_event_End'][i]):
        merged['FSNFSNew'][i]='FS'
    else:
        merged['FSNFSNew'][i]='NFS'
    i=i+1
0 голосов
/ 10 июля 2020

Самый простой способ решить вашу проблему - это pd.merge индивидуальные данные с данными о домохозяйстве с помощью двойного ключа, который будет household_id и channel

data = pd.merge(ind, household, how = 'left', on = ['household_id', 'channel'], left_index = False)

Затем вы можете создать FS_NFS столбцов на основе не пропущенного значения в channel_y переменной.

...