#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