我知道如何在数据帧上使用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做到这一点?
答案 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。