Python Dataframe: назначить значения столбцу на основе другого столбца? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть df с тремя столбцами a, b, c. Я хочу изменить NaN значения в столбце b. Например: для значения 123 в столбце a столбец b имеет значения abc и NaN. Я хочу изменить оба значения на abc.

raw_data = {'a': [123, 123, 456, 456], 
        'b': [np.nan,'abc','def',np.nan],
           'c':[np.nan,np.nan,0,np.nan]}
df = pd.DataFrame(raw_data, columns = ['a', 'b','c'])

    a   b   c
0   123 NaN NaN
1   123 abc NaN
2   456 def 0
3   456 NaN NaN

Мой ожидаемый результат

df


    a   b   c
1   123 abc NaN
0   123 abc NaN
2   456 def 0
3   456 def NaN

Что я пробовал:

df = df.sort_values(by=['a','b']).fillna(method='ffill')

Но это меняет column c также.

Вывод сверху:

a   b   c
1   123 abc NaN
0   123 abc NaN
2   456 def 0
3   456 def 0

Как использовать ffill для определенного столбца или любые другие рекомендуемые подходы?

Пример данных 2:

raw_data = {'a': [123, 123, 456, 456,789,np.nan], 
        'b': [np.nan,'abc','def',np.nan,np.nan,'ghi'],
           'c':[np.nan,np.nan,0,np.nan,np.nan,np.nan]}
df = pd.DataFrame(raw_data, columns = ['a', 'b','c'])

           a    b   c
    0   123.0   NaN NaN
    1   123.0   abc NaN
    2   456.0   def 0
    3   456.0   NaN NaN
    4   789.0   NaN NaN
    5   NaN     ghi abc

Ожидаемый результат

           a    b   c
    0   123.0   abc NaN
    1   123.0   abc NaN
    2   456.0   def 0
    3   456.0   def NaN
    4   789.0   NaN NaN
    5   NaN     ghi abc

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Для новых обновленных данных вы должны использовать Series.map:

df['b'] = df['a'].map(df.groupby('a')['b'].first()).fillna(df['b'])

       a    b    c
0  123.0  abc  NaN
1  123.0  abc  NaN
2  456.0  def  0.0
3  456.0  def  NaN
4  789.0  NaN  NaN
5    NaN  ghi  NaN

Старый ответ

Использовать groupby с ffill и bfill:

df['b'] = df.groupby('a')['b'].ffill().bfill()

     a    b    c
0  123  abc  NaN
1  123  abc  NaN
2  456  def  0.0
3  456  def  NaN
0 голосов
/ 15 апреля 2020

Функция fillna применяется ко всем DataFrame. Одно из решений состоит в том, чтобы усечь ваш DataFrame, чтобы иметь только те столбцы, которые вы хотите изменить, и применить только к нему функцию fillna, а затем добавить другой столбец:

 df_ab = df.loc[:,["a","b"]]
 df_ab = df_ab.sort_values(by=['a','b']).fillna(method='ffill')
 df_ab["c"] = df["c"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...