我遇到了使用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)
答案 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))