Панды заменяют значения в столбце значениями из другого столбца, но сохраняют некоторые значения - PullRequest
0 голосов
/ 22 октября 2019

Поэтому я заменяю некоторые значения в столбце Dataframe значениями из другого столбца, например:

df['A'] = df.ffill(1)['B']

Но в столбце A есть некоторые значения, которые я не хочу заменять, и сохраняюони как есть.

Значение, которое я хочу сохранить, встречается много раз и является строкой, поэтому, возможно, есть способ заменить все в столбце A на столбец B, но сохранить значения с определенной строкой?

Пример: допустим, мой фрейм данных выглядит следующим образом, и я хочу сохранить значение dog из столбца A, а затем заменить остальные значения (за исключением значений NaN) значениями из столбца B, как бы я это сделалчто.

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': ['dog', 'cat', 'mouse', 'spider', 'fish', 'dog'],
                   'B': ['New York', 'London', np.nan, 'Berlin', np.nan, 
                         'Paris']})

Результат должен выглядеть следующим образом:

df_result = pd.DataFrame({'A': ['dog', 'London', 'mouse', 'Berlin', 'fish', 
                                'Paris']})

Спасибо за вашу помощь заранее:)

Ответы [ 3 ]

2 голосов
/ 22 октября 2019

IIUC:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': ['dog', 'cat', 'mouse', 'spider', 'fish', 'dog'],
                   'B': ['New York', 'London', np.nan, 'Berlin', np.nan,
                         'Paris']})

df.loc[(~df["A"].str.contains("dog"))&(df["B"].notnull()),"A"] = df["B"]

print (df)
#
        A         B
0     dog  New York
1  London    London
2   mouse       NaN
3  Berlin    Berlin
4    fish       NaN
5     dog     Paris
2 голосов
/ 22 октября 2019

Если я вас правильно понимаю, вы хотите проверить not NaN в столбце B и использовать loc для замены значений только в столбце A, если значение не равно (ne) до dog:

m1 = df['A'].ne('dog')
m2 = df['B'].notna()

df.loc[m1&m2, 'A'] = df['B']

        A         B
0     dog  New York
1  London    London
2   mouse       NaN
3  Berlin    Berlin
4    fish       NaN
5     dog     Paris
0 голосов
/ 22 октября 2019

Вы можете просто зациклить элементы в «A» и убедиться, что для той же строки значение в «B» не равно NaN.

(Возможно, есть более чистый способ сделать это, используя встроенные df функции)

for x in range(len(df['A'])):
    if(df['A'][x] != "dog" and df['B'][x] != np.nan):
        df['A'][x] = df['B'][x]

Редактировать:

Более чистый способ с помощью loc

df.loc[(df['A'].ne('dog')) &(df['B'].notnull()) , 'A'] = df['B']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...