在Pandas数据框元素

时间:2016-07-01 08:11:15

标签: python arrays pandas apply

我正在使用pandas数据帧,其中包含dataframe元素中的数组。我正在尝试将一个函数“应用”到这些元素,然后返回一个数组。但我有一些非常不一致的行为。该函数在前几次运行正常,但随后失败。这是我的代码:

import pandas as pd
import numpy as np

def g(x):  # Function fails if I omit the .tolist()
    return (np.concatenate([x['B'][1:], x['C'][1:]])).tolist()

df = pd.DataFrame({'A' : (1,2,3), \
                   'B': (np.array([0,1,2,3]),np.array([3,4,5,6]),np.array([6,7,8,9])), \
                   'C': (np.array([0,1,2,3]),np.array([2,9,6,9]),np.array([2,4,6,7]))})
# Before we start
print(df)
print("B is type:  ", type(df.loc[0,'B']))
# First time 
df['G'] = df.apply(g, axis=1)
print("G is type:  ", type(df.loc[0,'G']))
# Second time
df['H'] = df.apply(g, axis=1)
print("H is type:  ", type(df.loc[0,'H']))
# Third time 
df['I'] = df.apply(g, axis=1)
print("I is type:  ", type(df.loc[0,'I']))
# Fourth time - this one fails for me
df['J'] = df.apply(g, axis=1)
print("J is type:  ", type(df.loc[0,'J']))
# Fifth time 
df['K'] = df.apply(g, axis=1)
print("K is type:  ", type(df.loc[0,'K']))

代码运行正常,直到df ['J']行,它失败了。输出是这样的:

   A             B             C
0  1  [0, 1, 2, 3]  [0, 1, 2, 3]
1  2  [3, 4, 5, 6]  [2, 9, 6, 9]
2  3  [6, 7, 8, 9]  [2, 4, 6, 7]
B is type:   <class 'numpy.ndarray'>
G is type:   <class 'list'>
H is type:   <class 'list'>
I is type:   <class 'list'>

然后有一条很长的错误消息会以"ValueError: Wrong number of items passed 6, placement implies 1"结束,而且还有一个"KeyError: 'J'"

疯狂的是,这个功能在前几次运行正常。我的问题是:

  • 为什么我的代码到达df['J']时会失败?
  • 如何让g(x)返回numpy数组而不是列表?如果我遗漏了.tolist()它会给我一个错误。
  • 在数据框元素中使用数组是否有更简单的方法?

任何帮助都会非常赞赏!我花了两天的时间试图了解这里发生了什么。

P.S。我没有解释为什么我在数据框元素中使用数组,但我可以解释一下你是否认为它会有所帮助。

1 个答案:

答案 0 :(得分:2)

在您应用g函数的不同时间之间,您的数据框会发生变化,那么每次大熊猫的反应都不会相同并不奇怪。如果您只需将其应用于列BC,我建议您输入:

df['J'] = df[['B','C']].apply(g, axis=1)
print("J is type:  ", type(df.loc[0,'J']))

通过这种方式,它可以正常工作(但是再一次只考虑BC列。

至于错误,根据Ians的说法,因为只要apply的输出超过6列,它就变成DataFrame而不是Series。然后它不能设置为df['J']