关于python:获取NaN而不是数据框列中的正确值

Getting NaN's instead of the correct values inside dataframe column

我使用以下语法创建了一个零数据框:

1
2
3
4
5
6
7
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)

效果如预期般完美

1
2
3
4
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

当我运行这个语法时:

1
ltv['customer_id'] = actual_df['customer_id']

我得到了 ltv['customer_id'] 中的所有 NaN。是什么原因造成的,我该如何防止它发生?

注意:我还检查了 actual_df,里面没有 NaN


你需要两个相同的索引值(并且两个数据帧的长度也相同)。

所以第一个解决方案是在actual_df中创建默认RabgeIndex,在ltv中没有指定,所以默认创建:

1
2
actual_df = actual_df.reset_index(drop=True)
ltv['customer_id'] = actual_df['customer_id']

或将参数index添加到DataFrame构造函数:

1
2
3
4
5
6
7
8
9
10
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']


另一个选项(比 jezrael 的好答案更复杂)是使用 pd.concat() 后跟 .drop():

1
ltv = pd.concat([ltv.drop(columns=['customer_id']),actual_df[['customer_id']]],axis=1,ignore_index=True)