传递值的形状x表示y与数据帧中的numpy.ndarray值

时间:2017-10-03 01:33:53

标签: python python-3.x pandas numpy

我遇到了使用DataFrame.apply的问题,其中两个参数的数据框包含numpy.ndarray。函数本身很简单,输出一个numpy.ndarray:

def get_opponent_choice(choice,outcome):
    opp_choice = np.zeros_like(choice)
    opp_choice[outcome > 0] = choice[outcome > 0]
    opp_choice[outcome < 0] = 1 - choice[outcome < 0]

    return opp_choice

get_opponent_choice(df['dir_choice'].loc[0],df['outcomes'].loc[0])
df.apply(lambda x : get_opponent_choice(x['dir_choice'],x['outcomes']),axis=1)

运行单个测试迭代是有效的,但是使用apply函数会让我遇到麻烦:

Shape of passed values is (343, 54), indices imply (343, 9)

理想情况下,我想将数据输出到包含numpy.ndarray数据类型的新列df ['dir_opp']中,该数据类型与输入数组的形状相匹配(在行之间不同)

根据要求,显示的每一行都有不同大小的数组,但在列之间保持相同: DataFrame relevant columns

玩具示例模拟问题,运行df.apply函数会产生相同的错误:

toy_dict = []
toy_dict.append({'dir_choice' : np.array([0, 0, 0, 1, 0, 0]), 'outcomes' : np.array([1, -1, -1, 1, 1, -1])})
toy_dict.append({'dir_choice' : np.array([0, 0, 1, 0, 1, 0, 0]), 'outcomes' : np.array([1, -1, 1, -1, 1, 1, -1])})
toy_dict.append({'dir_choice' : np.array([0, 0, 1]), 'outcomes' : np.array([-1, -1, -1])})
toy_df = pd.DataFrame.from_dict(toy_dict)

1 个答案:

答案 0 :(得分:0)

在对具有相同大小的数组值进行一些测试之后,我开始认为数组数据类型不是DataFrame.apply的理想输入/输出 - 尽管我希望被证明是错误的。

使用循环创建第二个要加入的数据框似乎工作正常:

def get_opponent_choice(choice,outcome):
    opp_choice = np.zeros_like(choice)
    opp_choice[outcome > 0] = choice[outcome > 0]
    opp_choice[outcome < 0] = 1 - choice[outcome < 0]

    return opp_choice

join_dict = []  
for row in df.itertuples(index=False):
    join_dict.append({'opp_dir' : \
    get_opponent_choice(row[0],row[1])})

df.join(pd.DataFrame.from_dict(join_dict))