У меня есть датафрейм:

df = pd.DataFrame({'col1': ['a', 'b', 'c', 'd'], 'col2': ['b', 'c', 'd', 'e'], 'col3': [1.0, 2.0, 3.0, 4.0]})

  col1 col2  col3
0    a    b   1.0
1    b    c   2.0
2    c    d   3.0
3    d    e   4.0

Моя цель - создать дополнительный col4, который содержит определенные значения из col3 с условием: для каждой строки x посмотрите значение в col1, и если есть другая строка y где-нибудь в df, где это значение присутствует в col2, возьмите Значение col3 формирует эту строку y и помещает его как col4 в исходную строку x. В противном случае оставьте col4 пустым для этой строки, например NaN.

Таким образом, ожидаемый результат для col4: NaN, 1, 2, 3. Для первой строки нет значения, так как в кадре данных нет строки с «a», это col2. В отличие от этого примера, в df строки могут быть полностью несортированы!

Expected output:

  col1 col2  col3  col4
0    a    b   1.0   NaN
1    b    c   2.0   1.0
2    c    d   3.0   2.0
3    d    e   4.0   3.0

Я пробовал использовать .mask, но пока не повезло. Спасибо за любую помощь!

1
hickz 27 Ноя 2021 в 22:03
Не могли бы вы предоставить образец ожидаемого выходного фрейма данных, чтобы помочь мне наглядно представить требования?
 – 
user17242583
27 Ноя 2021 в 22:04
Я отредактировал это в вопросе.
 – 
hickz
27 Ноя 2021 в 22:07
Я заметил, что NaN невозможно в столбцах с dtype int, поэтому я изменил col3 на float.
 – 
hickz
27 Ноя 2021 в 22:13

1 ответ

Лучший ответ

Вы можете присоединить фрейм данных к самому себе, используя col1 слева и col2 справа.

Переименуйте col3 с правой стороны соединения в col4 и удалите остальные столбцы с правой стороны пример:

df = df.merge(df, left_on='col1', right_on='col2', how='left', suffixes=('', '_'))
df = df.rename(columns={'col3_': 'col4'})
df = df[['col1', 'col2', 'col3', 'col4']]

Df выглядит так:

  col1 col2  col3  col4
0    a    b     1   NaN
1    b    c     2   1.0
2    c    d     3   2.0
3    d    e     4   3.0
1
Haleemur Ali 27 Ноя 2021 в 22:25
Это работает, спасибо!
 – 
hickz
28 Ноя 2021 в 00:13