Применение функции к другой части Dataframe - PullRequest
0 голосов
/ 28 мая 2018

Мне нужно применить разные функции для питона базы данных в зависимости от среза этого кадра данных.Каждая функция создает несколько столбцов.

Вот моя попытка (конечно, очень упрощенная версия):

df=pd.DataFrame({'Type':['O','O','A'],'A':[7,9,8],'B':[8,6,5]})

def f1(df):
    df['test']='A-OK'
    df['test2']='A-OK2'
    return df
def f2(df):
    df['test']='O-OK'
    df['test2']='O-OK2'
    return df

def function_test(df):
    df_a=df[df.Type =='A']
    df_o=df[df.Type =='O']
    #Applying functions
    df_a=f1(df_a)
    df_o=f2(df_o)

    #retrieving results
    df[df.Type =='A']=df_a
    df[df.Type =='O']=df_o

    return df
function_test(df)

Фреймы данных df_o и df_a (временные) содержат полезную информацию, но я не могу скопироватьрезультаты в оригинальном df после этого.

Редактировать: Исправлены опечатки

Ответы [ 2 ]

0 голосов
/ 28 мая 2018
df.assign(test=df.Type+'-OK', test2=df.Type+'-OK2') 

сделает это в 1 строку

#outputs

   A  B Type  test test2
0  7  8    O  O-OK  O-OK
1  9  6    O  O-OK  O-OK
2  8  5    A  A-OK  A-OK
0 голосов
/ 28 мая 2018

Ваша проблема заключается в назначении среза в строках:

df[df.Type =='A']=df_a
df[df.Type =='O']=df_o

После изменения опечатки в строке:

df_o=f2(df_o) # instead of f1

Просто верните:

pandas.concat([df_a, df_o]).sort_index()

Для вывода:

   A  B Type  test  test2
0  7  8    O  O-OK   O-OK
1  9  6    O  O-OK   O-OK
2  8  5    A  A-OK  A-OK2

Но рассмотрим более оптимально:

df['test'] = df['Type'].apply(lambda x: 'A-OK' if x == 'A' else 'O-OK')
df['test2'] = df['Type'].apply(lambda x: 'A-OK2' if x == 'A' else 'O-OK')

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...