一旦df包含时间序列,Pandas应用列表输出就会产生ValueError

时间:2016-09-20 22:16:48

标签: python pandas time-series

我试图实现一个返回两个值的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会有什么变化?

1 个答案:

答案 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

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:无法使用长度与值

不同的切片索引器进行设置