Назначить вывод функции в столбец информационного кадра для строк, которые соответствуют критериям в каком-либо другом столбце - PullRequest
2 голосов
/ 20 октября 2019

У меня есть фрейм данных 'df' со столбцами 'A' , 'B' , как показано. Я хочу создать новый столбец 'C' и присвоить ему выход функции func () . Однако ограничение заключается в том, что только тем строкам (в "C" ) могут быть назначены такие значения, для которых записи столбца "A" соответствуют "abc" . Для таких строк входной переменной для func () будет соответствующая запись в столбце 'B' .

Например, на прикрепленной фотографии в строке 0 и строке 2 столбец 'A' имеет значения 'abc' . Для таких строк значение в 'C' должно быть вычислено как func () с использованием значения в столбце 'B' (в этом случае либо "2222" или "4444" ).

Примечание: переменные 'var2' , 'var3' являютсянекоторые значения получены в другом месте в моей программе. Мы можем рассматривать их как константы для нашего обсуждения здесь.

enter image description here

Конечно, я могу использовать цикл for и добиться этого, однако яИнтересно, есть ли эффективный способ сделать это с помощью панд или NumPy. Я попытался использовать метод «.where», но кажется, что func () интерпретирует весь столбец «B» как входные данные, а не принимает каждый элемент столбца «B» (т. Е. ... «2222» или «4444»).

def func(var1, var2, var3):
    <something>
    return(output)

import numpy as np
df['C'] = np.where(data['A'] == 'abc', func(data['B'], var2, var3), " ")

1 Ответ

0 голосов
/ 20 октября 2019

IIUC, вы можете получить доступ к каждому элементу в вашем фрейме данных с помощью метода .loc и применить свое назначение там, используя .apply():

, не зная, сколько условий у вас есть, но имитируя ваш код выше:

df.loc[df['A'] == 'abc', 'C'] = df['B'].apply(func)

например,

import pandas as pd
a = ['abc','b','abc']
b = [1,2,3]
df = pd.DataFrame({'A' : a,
              'B' : b})
print(df)
   A  B
0  abc  1
1    b  2
2  abc  3
df.loc[df['A'] == 'abc','C'] = df['B'].apply(lambda x : x ** 2)
   A    B    C
0  abc  1  1.0
1    b  2  NaN
2  abc  3  9.0

если ваша логика более сложна, вы можете использовать np.select следующим образом:

conditions  = [ df['B'] >= 3, (df['B'] < 3) & (df['B']> 1), df['B'] <= 1]
choices     = [ "high", 'medium', 'low' ]

df["C"] = np.select(conditions, choices, default=np.nan)

print(df)
     A  B       C
0  abc  1     low
1    b  2  medium
2  abc  3    high
...