如何仅使用返回多个值的函数的一个特定输出来操纵列条目?

时间:2019-07-04 15:59:36

标签: python pandas dataframe apply

我有一个这样的数据框:

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,以说明这不是我的实际功能,而只是作为具有多个输出的最小示例功能。

2 个答案:

答案 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'])

或者如果返回值可以分开(在这种情况下,maxmin实际上不需要在同一函数中完成),则将它们分开更简单:

def return_max(x):
    return np.max(x)

df.add(df.apply(return_max))