我有一个这样的数据框:
import numpy as np
import pandas as pd
df = pd.DataFrame({'a': range(4), 'b': range(2, 6)})
a b
0 0 2
1 1 3
2 2 4
3 3 5
,我有一个返回几个值的函数。在这里,我只使用 dummy函数,该函数返回某个可迭代输入的最小值和最大值:
def return_min_max(x):
return (np.min(x), np.max(x))
现在我想例如将每一列的最大值添加到相应列中的每个值。
所以
df.apply(return_min_max)
给予
a (0, 3)
b (2, 5)
然后
df.add(df.apply(return_min_max).apply(lambda x: x[1]))
产生理想的结果
a b
0 3 7
1 4 8
2 5 9
3 6 10
我想知道是否有更直接的方法来避免将两个apply
链接在一起。
只需确保:
我对
不感兴趣df.add(df.max())
型解决方案。我强调了dummy_function
,以说明这不是我的实际功能,而只是作为具有多个输出的最小示例功能。
答案 0 :(得分:3)
第二看,您的pandas_df = pandas_df[pandas_df.columns.intersection(final_table_columns)]
是列函数。所以还不错。您可以这样做,例如:
return_min_max
输出:
# create a dataframe for easy access
ret_df = pd.DataFrame(df.apply(return_min_max).to_dict())
# a b
# 0 0 2
# 1 3 5
# add
df.add(ret_df.loc[1], axis=1)
和numpy广播:
a b
0 3 7
1 4 8
2 5 9
3 6 10
给予:
df.values[None,:] + ret_df.values[:,None]
答案 1 :(得分:2)
DataFrame.max
将返回一系列的列最大值。 DataFrame.add()
然后将添加此Series
,并按列对齐。
df.add(df.max())
# a b
#0 3 7
#1 4 8
#2 5 9
#3 6 10
如果您的实函数复杂得多,则有几种选择。
保持原样,使用.str
访问max元素。
def return_min_max(x):
return (np.min(x), np.max(x))
df.add(df.apply(return_min_max).str[1])
考虑返回一个带有描述返回内容的索引的系列:
def return_min_max(x):
return pd.Series([np.min(x), np.max(x)], index=['min', 'max'])
df.add(df.apply(return_min_max).loc['max'])
或者如果返回值可以分开(在这种情况下,max
和min
实际上不需要在同一函数中完成),则将它们分开更简单:
def return_max(x):
return np.max(x)
df.add(df.apply(return_max))