Pandas обновить значение строки в столбце B на основе значения строки в столбце A - PullRequest
0 голосов
/ 18 января 2020

Ниже приведен пример моего data frame. Я создал столбец B, в котором значение для каждой строки равно NaN

      Column A    Column B

1        Xo          NaN     
2       Es-Ab        NaN
3       Pr-Ab        NaN
4       Pr-Bs        NaN
5       Tr-Ab        NaN
6        Ab          NaN
7        Es          NaN
8       Es-Bs        NaN

. Мне нужно вставить значения в столбец B, основываясь на строковом значении в столбце A. Нужно написать оператор case, т.е. если / функция elif / else в python возможно. Нужна помощь с логикой / синтаксисом в python, так как перед вставкой значений мне также нужно проверить, равно ли значение строки в столбце B NaN.

Блок псевдокода, который я предполагаю, выглядит следующим образом:

if (column A contains X) and (column B = NaN) then ABC
if (column A contains Ab or Pr) and (column B = NaN) then DEF
if (column A contains Es) and (column B = Nan) then GHI
else Other

И мне нужно оценить это для каждой строки моего фрейма данных и назначить значение строки в столбце B согласно вышеуказанный лог c. Таким образом, мой окончательный результат будет выглядеть так:

      Column A    Column B

1        Xo          ABC     
2       Es-Ab        DEF
3       Pr-Ab        DEF
4       Pr-Bs        DEF
5       Tr-Ab        DEF
6        Ab          DEF
7        Es          GHI
8       Es-Bs        GHI

Ответы [ 3 ]

1 голос
/ 18 января 2020

Вы можете применить условия в 3 строки, а остальные заполнить другими

df.loc[df['column A'].str.contains('X'), 'B'] = ABC
df.loc[df['column A'].str.contains('Ab|Pr'), 'B'] = DEF
df.loc[df['column A'].str.contains('Es'), 'B'] = GHI
df['B'] = df['B'].fillna('Other')
1 голос
/ 18 января 2020

Вы можете сделать это с приложением.

Это должно работать:

def get_columnB(row):
    a = row["Column A"]
    b = row["Column B"]
    if b != np.NaN:
        return "Other"
    elif "X" in a:
        return "ABC"
    elif "Ab" in a or "Pr" in a:
        return "DEF"
    elif "Es" in a:
        return "GHI"
    return "Other"

df["Column B"] = df.apply(get_columnB,axis=1)

Будьте осторожны, я не знаю, важно ли, чтобы он учитывал регистр. Поэтому, если регистр не учитывается, используйте lower()

a = row["Column A"].lower()
b = row["Column B"].lower()

и измените "X", "AB" ... на "x", "ab"

0 голосов
/ 18 января 2020

Использование numpy:

import numpy as np
col_a = 'Column A'
col_b = 'Column B'


conditions = [
            (df[col_a].str.contains('X')) & (df[col_b].isnull()),
             (df[col_a].str.contains('Ab|Pr')) & (df[col_b].isnull()),
            (df[col_a].str.contains('Es')) & (df[col_b].isnull())
             ]

outputs = ['ABC','DEF','GHI']

df[col_b] = np.select(conditions,outputs,default='Other')

print(df)
  Column A Column B
0     1 Xo      ABC
1  2 Es-Ab      DEF
2  3 Pr-Ab      DEF
3  4 Pr-Bs      DEF
4  5 Tr-Ab      DEF
5    6  Ab      DEF
6    7  Es      GHI
7  8 Es-Bs      GHI
...