2015-06-04 93 views
2

我需要从我的熊猫df传递5列,并将结果5个值加入同一行。熊猫地图并加入多列

df.head() 

      BP Pain Pulse RR Temp 
0  111/111  9  75 13 97.1 
1  None None None 18  98 
2  164/87  6  79 15 None 
3  120/72  5  77 18  97 

被称为VSCleaner

VSCleaner.CleanVSSET(df.BP, df.Pain, df.Pulse, df.RR, df.Temp) 

将返回类似

{'BP': '120/40', 'Pain': 2, 'Pulse': 180, 'RR': 18, 'Temp': 66.0}, True 

我需要通过每个DF排进该函数的另一个模块中所产生的字典和布尔值插入同一行(cleaned_BP, cleaned_Pain, cleaned_Pulse, cleaned_RR, cleaned_Temp , BOOL isCleaned)并在我所有的df中运行。我找到

回答

1

最简单的方法:

>>> def CleanVSSET_apply(x): 
     # in my case CleanVSSET just returns the same values 
     d = CleanVSSET(*x.values) 
     r = d[0] 
     r['Cleaned'] = d[1] 
     return pd.Series(r) 
>>> 
>>> df_cleaned = df.apply(CleanVSSET_apply, axis=1) 
     BP Cleaned Pain Pulse RR Temp 
0 111/111 True  9 75 13 97.1 
1  None True None None 18 98 
2 164/87 True  6 79 15 None 
3 120/72 True  5 77 18 97 

>>> pd.merge(df, df_cleaned, left_index=True, right_index=True, suffixes=['', 'cleaned']) 
     BP Pain Pulse RR Temp BP_cleaned Cleaned Pain_cleaned \ 
0 111/111  9 75 13 97.1 111/111 True   9 
1  None None None 18 98  None True   None 
2 164/87  6 79 15 None  164/87 True   6 
3 120/72  5 77 18 97  120/72 True   5 

    Pulse_cleaned RR_cleaned Temp_cleaned 
0   75   13   97.1 
1   None   18   98 
2   79   15   None 
3   77   18   97 
+0

'CleanVSSET'必须具有特定顺序的值。 '(* x.values)''df并不能保证 – Hakim

+0

你可以很容易地将它改成'vscleaner.CleanVSSet(x ['Pulse'],x ['RR'],x ['Pain'],x ['Temp'],x ['BP'])' –

+0

我用你的答案更快 – Hakim

0

这就是我所做的,最后它的工作原理,并返回所需的输出。

for index, row in df.iterrows(): 
    cleaned_dict, isSwapped = vscleaner.CleanVSSet(row['Pulse'], row['RR'], row['Pain'], row['Temp'], row['BP']) 
    df.loc[index, 'Pulse_cleaned'] = cleaned_dict['Pulse'] 
    df.loc[index, 'RR_cleaned'] = cleaned_dict['RR'] 
    df.loc[index, 'Pain_cleaned'] = cleaned_dict['Pain'] 
    df.loc[index, 'Temp_cleaned'] = cleaned_dict['Temp'] 
    df.loc[index, 'BP_cleaned'] = cleaned_dict['BP'] 
    df.loc[index, 'isSwapped'] = isSwapped