首页 > 解决方案 > 在数据框的不同部分应用函数

问题描述

我需要根据这个数据框的一部分为数据库 python 应用不同的函数。每个函数创建几个列。

这是我的尝试(当然是非常简化的版本):

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 中。

编辑:错别字更正

标签: pythonpandas

解决方案


您的问题是在行中分配给切片:

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')

等等。


推荐阅读