我正在使用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。我没有解释为什么我在数据框元素中使用数组,但我可以解释一下你是否认为它会有所帮助。
答案 0 :(得分:2)
在您应用g
函数的不同时间之间,您的数据框会发生变化,那么每次大熊猫的反应都不会相同并不奇怪。如果您只需将其应用于列B
和C
,我建议您输入:
df['J'] = df[['B','C']].apply(g, axis=1)
print("J is type: ", type(df.loc[0,'J']))
通过这种方式,它可以正常工作(但是再一次只考虑B
和C
列。
至于错误,根据Ians的说法,因为只要apply的输出超过6列,它就变成DataFrame
而不是Series
。然后它不能设置为df['J']
。