Python / pandas - 使用DataFrame.apply和函数返回字典

时间:2017-10-18 12:51:47

标签: python pandas

我知道如何在数据帧上使用apply函数来计算新列并将它们附加到数据帧。我的问题是,如果我有一个函数,它将多个值作为参数(对应于当前在数据帧中的列)并返回一个字典(对应于我想要添加到数据帧的列),是否有简单/优雅的方式将此函数应用于数据框并生成新列?

例如,目前我这样做:

import pandas as pd
import numpy as np

col1 = [np.random.randn()] * 10
col2 = [np.random.randn()] * 10
col3 = [np.random.randn()] * 10

df = pd.DataFrame({'col1': col1,
                   'col2': col2,
                   'col3': col3 })

df['col4'] = df.apply(lambda x: get_col4(x['col1'], x['col2']), axis=1)
df['col5'] = df.apply(lambda x: get_col5(x['col1'], x['col2'], x['col3']), 
axis=1)
df['col6'] = df.apply(lambda x: get_col6(x['col3'], x['col4'], x['col5']), 
axis=1)
df['col7'] = df.apply(lambda x: get_col7(x['col4'], x['col6']), axis=1)

其中我为每个计算列提供了单独的函数,每个函数都依赖于前面列的某些组合。

但是,由于计算列的值彼此依赖,我认为使用类似下面的函数来同时计算新列会更加高效和优雅:

def get_cols(col1, col2, col3):
    #some calculations...
    return {'col4': col4,
            'col5': col5,
            'col6': col6,
            'col7': col7}

有没有办法用pandas做到这一点?

2 个答案:

答案 0 :(得分:3)

由于您希望保留以前的列,因此可以从新列中创建一个Series,然后将该新Series对象附加到原始Series。请注意,get_cols的输入是原始DataFrame中的单个(因此是系列)。

import pandas as pd
import numpy as np

def get_cols(cols):
    col4 = cols[0] * 2
    col5 = cols[1] * 2
    col6 = cols[2] * 2
    return cols.append(pd.Series([col4, col5, col6], index=['col4', 'col5', 'col6']))

col1 = [np.random.randn()] * 10
col2 = [np.random.randn()] * 10
col3 = [np.random.randn()] * 10

df = pd.DataFrame({'col1': col1,
                   'col2': col2,
                   'col3': col3 })

df = df.apply(get_cols, axis=1)
print(df)

       col1      col2      col3      col4      col5      col6
0 -0.809803  0.522547  0.064061 -1.619606  1.045093  0.128122
1 -0.809803  0.522547  0.064061 -1.619606  1.045093  0.128122
2 -0.809803  0.522547  0.064061 -1.619606  1.045093  0.128122
3 -0.809803  0.522547  0.064061 -1.619606  1.045093  0.128122
4 -0.809803  0.522547  0.064061 -1.619606  1.045093  0.128122
5 -0.809803  0.522547  0.064061 -1.619606  1.045093  0.128122
6 -0.809803  0.522547  0.064061 -1.619606  1.045093  0.128122
7 -0.809803  0.522547  0.064061 -1.619606  1.045093  0.128122
8 -0.809803  0.522547  0.064061 -1.619606  1.045093  0.128122
9 -0.809803  0.522547  0.064061 -1.619606  1.045093  0.128122

答案 1 :(得分:0)

这可能会对您有所帮助:pandas apply function that returns multiple values to rows in pandas dataframe

正确的方法是使用第二个函数“get_cols”返回列表而不是字典,然后使用apply。