我使用以下语法创建了一个零数据框:
ltv = pd.DataFrame(data=np.zeros([actual_df.shape[0], 6]),
columns=['customer_id',
'actual_total',
'predicted_num_purchases',
'predicted_value',
'predicted_total',
'error'], dtype=np.float32)
它出乎意料地完美
customer_id | actual_total | predicted_num_purchases | predicted_value | predicted_total | error
0 0.0 0.0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0 0.0 0.0
当我运行以下语法时:
ltv['customer_id'] = actual_df['customer_id']
我在ltv['customer_id']
中得到所有NaN。是什么原因造成的,如何防止它发生?
NB :我还检查了actual_df
,并且里面没有NaNs
答案 0 :(得分:2)
两者(以及两个DataFrame的长度)都需要相同的索引值。
第一个解决方案是在RabgeIndex
中创建默认actual_df
,在ltv
中未指定,因此默认创建:
actual_df = actual_df.reset_index(drop=True)
ltv['customer_id'] = actual_df['customer_id']
或将参数index
添加到DataFrame
构造函数中:
ltv = pd.DataFrame(data=np.zeros([actual_df.shape[0], 6]),
columns=['customer_id',
'actual_total',
'predicted_num_purchases',
'predicted_value',
'predicted_total',
'error'], dtype=np.float32,
index=actual_df.index)
ltv['customer_id'] = actual_df['customer_id']
答案 1 :(得分:0)
另一种选择(比jezrael的好答案更复杂)是使用pd.concat()
,然后使用.drop()
:
ltv = pd.concat([ltv.drop(columns=['customer_id']),actual_df[['customer_id']]],axis=1,ignore_index=True)