Pandas df: заполните значения в новом столбце конкретными значениями из другого столбца (условие с несколькими столбцами)

#python #pandas #dataframe

Вопрос:

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

 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, и если где-либо в df есть другая строка y, где это значение присутствует в 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. Не могли бы вы предоставить образец ожидаемого выходного кадра данных, чтобы помочь мне визуализировать требования?

2. Я отредактировал его в вопросе.

3. Я заметил, что NaN невозможен в столбцах с типом dtype int, поэтому я изменил col3 на float.

Ответ №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