Добавление значения из одного фрейма данных pandas в другой фрейм данных путем сопоставления переменной

#python #pandas #dataframe #matching

#python #pandas #фрейм данных #сопоставление

Вопрос:

Предположим, у меня есть фрейм данных pandas df с 2 столбцами

            c1            c2
    0      v1            b1
    1      v2            b2
    2      v3            b3
    3      v4            b4
    4      v5            b5
 

Второй df2 фрейм данных содержит c1, c2 и несколько других столбцов.

    c1 c2 c3  c4
0  "" b5 500 3
1  "" b2 420 7
2  "" b1 380 5
3  "" b2 470 9
4  "" b3 290 2
 

Моя цель — заменить пустые значения для c1 в df2 на значения в df, соответствующие значениям в c2, поэтому первые пять значений для c1 в df2 должны быть v5, v2, v1, v2 и v3 соответственно. Каков наилучший способ сделать это?

Ответ №1:

Один из простых способов, который вы можете сделать, это использовать слияние pandas на основе аналогичного столбца.

df2.drop('c1', axis=1, inplace=True)

main_df = pd.merge(df2, df, on="c2", how="left")

df2['c1'] = main_df['c1']

df2.columns = ['c1','c2','c3','c4']

Комментарии:

1. Это дает мне NaNs для c1

2. Затем вы можете удалить столбец C1 из df2. Смотрите обновленный код. Надеюсь, это поможет

Ответ №2:

Что-то вроде этого может быть тем, что вы ищете:

 import pandas as pd
import numpy as np
# remove the c1 column from df2
df2.drop("c1", axis=1, inplace=True)
# merge the 2 dataframes and get the c1 values corresponding to c2
newdf = df.merge(df2, on="c2")
 

Если у вас действительно отсутствуют значения в столбце (например, NAs и некоторые строки, в которых присутствуют значения, решение будет другим)

Комментарии:

1. Нет, в результате это дает пустой фрейм данных. Моя цель — не объединить фреймы данных, а заменить отсутствующие значения в c1 в df2 на значения в df1, соответствующие c2

2. попробуйте сначала запустить это: df2.drop(«c1», axis= 0, inplace= True). Затем запустите другой код.

3. получил эту ошибку KeyError: «[‘c1’] не найден в axis»

4. извините, ось должна быть 1

5. Одна небольшая проблема с этим подходом заключается в том, что после объединения фрейм данных сортируется по c2. Есть ли способ избежать этого?