Python 如何仅使用返回多个值的函数的一个特定输出操作列条目?
我有这样一个数据帧:Python 如何仅使用返回多个值的函数的一个特定输出操作列条目?,python,pandas,dataframe,apply,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 我有一个函数,它返回几个值。这里我只使用一个伪函数,它返回某个输入变量的最小值和最大值: def return_min_max(x): return (np.min(x), np.max(x)) 现
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
我有一个函数,它返回几个值。这里我只使用一个伪函数,它返回某个输入变量的最小值和最大值:
def return_min_max(x):
return (np.min(x), np.max(x))
现在,我想将每列的最大值与相应列中的每个值相加
所以
给予
然后
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
我想知道是否有一种更直接的方法可以避免双链的应用
为了确保:
我对一份工作不感兴趣
df.add(df.max())
键入解决方案。我突出显示了dummy_函数
,以说明这不是我的实际函数,而是一个具有多个输出的最小示例函数。DataFrame.max
将返回一系列列最大值DataFrame.add()
随后将添加此系列
,并在列上对齐
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))
再看一眼,您的return\u min\u 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)
输出:
a b
0 3 7
1 4 8
2 5 9
3 6 10
和numpy广播:
df.values[None,:] + ret_df.values[:,None]
给出:
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 3, 7],
[ 4, 8],
[ 5, 9],
[ 6, 10]]], dtype=int64)
第一个问题是dummyreturn\u min\u max
函数。正如您所提到的,您不希望应用
,但是如果没有更多的细节,几乎不可能知道如何对该函数进行矢量化。第二部分是简单的numpy广播。如果我可以问的话,你为什么要编写返回多个值的函数?@QuangHoang:函数是固定的,我无法更改它,所以向量化无法工作。你会如何在这里使用numpy广播?@Erfan:不是我的功能,但我得拿我得到的;).str[1]
解决方案看起来不错。谢谢其他解决方案不起作用,因为函数确实要复杂得多。
df.values[None,:] + ret_df.values[:,None]
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 3, 7],
[ 4, 8],
[ 5, 9],
[ 6, 10]]], dtype=int64)