gpt4 book ai didi

python - 一旦 df 包含时间序列,Pandas apply with list output 会给出 ValueError

转载 作者:行者123 更新时间:2023-11-28 18:28:12 25 4
gpt4 key购买 nike

我正在尝试实现一个返回两个值的应用函数,因为计算相似且非常耗时,所以我不想应用两次。下面是一个非常愚蠢的 MWE,我知道有更简单的方法可以实现这个 MWE 的功能。我的实际功能更复杂,但我已经遇到这个 MWE 的错误:

所以,我让这个工作:

def function(row):
return [row.A, row.A/2]

df = pd.DataFrame({'A' : np.random.randn(8),
'B' : np.random.randn(8)})
df[['D','E']] = df.apply(lambda row: function(row), axis=1).apply(pd.Series)

但是,这不会:

df2 = pd.DataFrame({'A' : np.random.randn(8),
'B' : pd.date_range('1/1/2011', periods=8, freq='H'),
'C' : np.random.randn(8)})
df2[['D','E']] = df2.apply(lambda row: function(row), axis=1).apply(pd.Series)

相反,它给了我ValueError:传递值的形状是 (8, 2),索引表示 (8, 3)

我不明白为什么改变 B 列的类型会影响结果,它甚至根本没有用在应用函数中?

我想我可以通过暂时排除日期列来避免示例中的这个问题。但是,稍后在我的函数中我将需要使用日期。

谁能解释一下,为什么这个例子不起作用?包含 TS 会发生什么变化?

最佳答案

function 返回一个 pd.Series。返回一个列表使 apply 尝试将列表放入现有行中。返回一个 pd.Series 让 pandas 相信一些不同的东西。

def function(row):
return pd.Series([row.A, row.A/2])


df2 = pd.DataFrame({'A' : np.random.randn(8),
'B' : pd.date_range('1/1/2011', periods=8, freq='H'),
'C' : np.random.randn(8)})
df2[['D','E']] = df2.apply(function, axis=1)

df2

enter image description here


尝试解释

s = pd.Series([1, 2, 3])
s

0 1
1 2
2 3
dtype: int64

s.loc[:] = [4, 5, 6]
s

0 4
1 5
2 6
dtype: int64

s.loc[:] = [7, 8]

ValueError: cannot set using a slice indexer with a different length than the value

关于python - 一旦 df 包含时间序列,Pandas apply with list output 会给出 ValueError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39604586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com