pandas 将多个输入列转换为多个输出列的最佳方法?

rt4zxlrg  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(93)

我有一个简单的函数,它接受一个数字序列,并返回一个4个值的元组,例如该序列的(最小值,最大值,第一个,最后一个)元素。我不能只使用内置函数来获取每个值;我需要实际使用我的函数)。* 我希望将此函数应用于DataFrame的所有列,并在新的DataFrame中返回结果,同时保留索引。
几天前,我做了以下工作:将初始DataFrame转换为一系列输入元组;apply() my函数,创建一系列输出元组;并从这个输出序列创建一个新的DataFrame,将输出元组扩展到各个列中。

def fn(a): return (min(a), max(a), a[0], a[-1])

df = pd.DataFrame([(2, 4, 5, 1, 3), (12, 14, 15, 11, 13), (20, 40, 50, 10, 30)], index=['a', 'b', 'c'])
sr = pd.Series(df.to_numpy().tolist(), index=df.index)
sr2 = sr.apply(fn)
print(pd.DataFrame(sr2.values.tolist(), index=df.index))

    0   1   2   3
a   1   5   2   3
b  11  15  12  13
c  10  50  20  30

然而,现在几天过去了,胜利的喜悦已经消退,感觉这段代码不可能是正确的,它的步骤太多,矢量化不够,我确信我错过了一些东西。
做这件事有更简单/更快/更好的方法吗?

rslzwgfq

rslzwgfq1#

使用:agg

def first(x): return x.iloc[0]
def last(x): return x.iloc[-1]

out = df.agg(['min', 'max', first, last], axis=1)

输出:

min  max  first  last
a    1    5      2     3
b   11   15     12    13
c   10   50     20    30
备选方案
def fn(a): return (np.min(a, 1), np.max(a, 1), a.iloc[:,0], a.iloc[:,-1])

pd.concat(fn(df), axis=1)

相关问题