Индекс объединения панд со значением в столбце и идентификатором - PullRequest
1 голос
/ 14 октября 2019

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

targets = {'index':[3, 4, 5],
        'sequence_id':[140366A0464161, 140366A0464178, 140366A0464189],
        'target': [0, 1, 0]}


data = {'sequence_id':[140366A0464161, 140366A0464161, 140366A0464161, 140366A0464178, 140366A0464178, 140366A0464178, 140366A0464178, 140366A0464178],
        'feature_1' : ['true', 'true', 'false', 'false', 'true', 'true', 'false', 'false']}

Я хочу создать еще один кадр данных, в котором столбцы index и sequence_id из targets соответствуют индексу sequence_id в data.

Под этим я подразумеваю, например, третий индекс 140366A0464161 будет false и цель 0, например. Индекс не всегда может быть последним экземпляром для каждого sequence_id. В данных также имеется больше возможностей, чем features_1.

Мой ожидаемый результат будет:

   index     sequence_id  feature_1 target
0      3  140366A0464161    false     0
1      4  140366A0464178    false     0
2      5  140366A0464189    true      0

С точки зрения того, что я пробовал: я попытался выполнить соединение на основеsequence_id, но осознайте, что это намного больше, чем индекс, поскольку в data этот индекс не соответствует действительности, так что это поставило меня в тупик!

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Насколько я понимаю, вы хотите принять последнее значение для каждого sequence_id, потому что у вас есть несколько идентичных sequence_id в вашем фрейме данных 'data' (Если вы дадите дополнительную информацию о желаемой логике соединения, возможно, это будет другоерешение).

Итак, первый шаг - конвертируйте его в соответствующий формат:

df1 = pd.DataFrame.from_dict(targets).set_index('index')
df2 = pd.DataFrame.from_dict(data).set_index('sequence_id')

conv_df = df2.groupby('sequence_id').nth([-1]) 

Out[80]: 
               feature_1
sequence_id             
140366A0464161     false
140366A0464178     false

, а затем просто добавьте его:

df1.merge(conv_df, left_on = 'sequence_id', right_index = True)

Out[83]: 
          sequence_id  target feature_1
index                                  
3      140366A0464161       0     false
4      140366A0464178       1     false
0 голосов
/ 14 октября 2019

Я считаю, что вам нужно DataFrame.merge с левым соединением:

t = pd.DataFrame(targets)
df = pd.DataFrame(data)

#convert column to boolean
df['feature_1'] = df['feature_1'].map({'true':True, 'false':False})

#merge by index column with left join and replace missing values by `False`
df = (t.merge(df.reset_index(), on=['index','sequence_id'], how='left')
       .fillna({'feature_1':False}))

print (df)
   index     sequence_id  target  feature_1
0      3  140366A0464161       0      False
1      4  140366A0464178       1       True
2      5  140366A0464189       0      False

Деталь :

print (t.merge(df.reset_index(), on=['index','sequence_id'], how='left'))
   index     sequence_id  target feature_1
0      3  140366A0464161       0       NaN
1      4  140366A0464178       1      True
2      5  140366A0464189       0       NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...