我正在尝试使用应用函数来创建2个新列。当dataframe有索引时,它不工作,新列的值为NaN。如果dataframe没有索引,那么它工作。您能帮忙吗?谢谢
def calc_test(row):
a=row['col1']+row['col2']
b=row['col1']/row['col2']
return (a,b)
df_test_dict={'col1':[1,2,3,4,5],'col2':[10,20,30,40,50]}
df_test=pd.DataFrame(df_test_dict)
df_test.index=['a1','b1','c1','d1','e1']
df_test
col1 col2
a1 1 10
b1 2 20
c1 3 30
d1 4 40
e1 5 50
现在我使用apply函数,新创建的列的值为NaN。谢谢你的帮助。
df_test[['a','b']] = pd.DataFrame(df_test.apply(lambda row:calc_test(row),axis=1).tolist())
df_test
col1 col2 a b
a1 1 10 NaN NaN
b1 2 20 NaN NaN
c1 3 30 NaN NaN
d1 4 40 NaN NaN
e1 5 50 NaN Na
2条答案
按热度按时间r7xajy2e1#
当使用
apply
时,您可以使用result_type ='expand'
参数将函数的输出扩展为panda Dataframe的列:这将返回:
yhqotfr82#
您正在将
apply
的返回值 Package 为DataFrame,该DataFrame的默认索引为[0, 1, 2, 3, 4]
,它在原始DataFrame的索引中不存在。您可以通过查看pd.DataFrame(df_test.apply(lambda row:calc_test(row),axis=1).tolist())
的输出来查看这一点。只需删除
pd.DataFrame()
即可解决此问题。df_test[['a', 'b']] = df_test.apply(lambda row:calc_test(row),axis=1).tolist()