Код: Выделить всё
df1 = pd.DataFrame({
'a': [1, 6, 3, 9],
'b': ['A', 'B', 'C', 'D'],
'c': [10, 20, 30, 40],
'd': [100, 200, 300, 400]
})
df2 = pd.DataFrame({
'm': [1, 5, 3, 7],
'n': [2, 6, 8, 4],
'o': [9, 10, 11, 12]
})
Код: Выделить всё
df1['a']
После некоторого поиска в Google и чата я обнаружил плавление df2 и слияние с df1 полезен, за исключением того, что он не проверяет совпадение в df2['m'].
Код:< /p>
Код: Выделить всё
df2_melted = df2.melt(id_vars=['m'], value_vars=['n', 'o'])
merged_df = df1.merge(df2_melted, left_on='a', right_on='value', how='left')
df1['e'] = merged_df['m']
print(df1)
Код: Выделить всё
a b c d e
1 A 10 100 NaN # df1['a'] == df2['m']
6 B 20 200 5.0 # df1['a'] == df2['n']
3 C 30 300 NaN # df1['a'] == df2['m']
9 D 40 400 1.0 # df1['a'] == df2['o']
Код: Выделить всё
a b c d e
1 A 10 100 1
6 B 20 200 5
3 C 30 300 3
9 D 40 400 1
Тогда я подумал, если df1['a'] соответствует df2['m'], тогда df1['e'] == df1['a'] == df2['m']. Поэтому простая замена значения NaN на df1['a'] должна сработать, и это сработало. Но пришлось преобразовать столбец в int; из-за NaN оно изменилось на плавающее.
Рабочий полный код:
Код: Выделить всё
df2_melted = df2.melt(id_vars=['m'], value_vars=['n', 'o'])
merged_df = df1.merge(df2_melted, left_on='a', right_on='value', how='left')
df1['e'] = merged_df['m']
df1['e'] = (df1['e'].fillna(df1['a'])).astype(int)
Есть ли другой лучший подход, который может помочь с моим требованием?
PS1: В приведенном выше примере не обязательно, чтобы df1 и df2 будет иметь такое же количество строк.
Подробнее здесь: https://stackoverflow.com/questions/790 ... if-matches