我试图实现一个返回两个值的apply函数,因为计算相似而且相当耗时,所以我不想做两次应用。 下面是一个非常愚蠢的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列的类型会影响结果,甚至根本不在apply函数中使用它?
我想我可以通过临时排除日期列来避免此示例中的问题。但是,在我的函数中,我将需要使用日期。
有人可以解释一下,为什么这个例子不起作用?包含TS会有什么变化?
答案 0 :(得分:1)
让function
代替pd.Series
。返回列表正在尝试将列表放入现有行。返回pd.Series
说服不同的大熊猫。
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
尝试解释
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:无法使用长度与值
不同的切片索引器进行设置