【问题标题】:Python pandas .join() returns NaN in the column I joinedPython pandas .join() 在我加入的列中返回 NaN
【发布时间】:2022-01-24 20:00:41
【问题描述】:

首先我将介绍这篇文章的全部内容。

我正在从“使用 SciKit 和 Tensorflow 进行机器学习”一书中学习 NN——从我的母语进行松散的翻译。 在第二章中,本书的作者介绍了一个神经网络,它可以根据各种输入预测房价。

完成本章后,我决定尝试在图表上查看结果并将它们与训练数据进行比较,但为此我需要将 numpy 预测数组转换为 pandas 数据帧,然后将预测与测试数据连接起来. 但是由于某种原因,当我使用plot_test_data = plot_test_data.join(predicted_data_frame) 在转换后的 numpy 矩阵上,pandas 数据框对象中的结果列由 NaN 组成。

测试数据由数千个样本组成,其中 5 个是随机抽取的。

测试数据示例的Dtypes:

test_data.dtypes:
longitiude         float64
latitiude        float64
housing median age    float64
count of rooms        float64
count of bedrooms     float64
population            float64
families              float64
median earnings       float64
distance to ocean     object
dtype: object

根据这个测试数据,使用 SciKit 线性回归模型进行预测,结果数组是一个 numpy 数组。 预测:

 [ 85657.90192014 305492.60737488 152056.46122456 186095.70946094
   244550.67966089]

现在我正在使用 pandas .DataFrame() 函数转换这个数组,如下所示:

plot_test_data = test_data.drop('distance to ocean', axis=1) # since 'distance to ocean' is 
not a numerical value I drop it for plotting purposes
predicted_data_frame = pd.DataFrame(predictions.T, columns=['housing median'])
# and then I join predicted_data_frame and plot_test data:
plot_test_data = plot_test_data.join(predicted_data_frame)

但是合并的predicted_data_frame pandas 对象中的结果列由 NaN 组成; 即使housing median 列由 float64 类型组成:

plot_test_data:
longitiude         float64
latitiude        float64
housing median age    float64
count of rooms        float64
count of bedrooms     float64
population            float64
families              float64
median earnings       float64
housing median        float64
dtype: object

我不知道如何解决这个问题,老实说,我发现知道如何可视化我的未来模型的预测很重要,这样它们就可以在他们将要做的任何事情中证明是有用的,我已经搜索过谷歌搜索类似的问题,但我觉得我没有找到答案(或者我不明白)。 所以我真的很感激你的帮助。

提前谢谢你:)

我已尽力描述问题所在,希望可以理解。

编辑: 好的,join() 函数需要一个“密钥”,所以我这样做了:

plot_test_data = test_data.drop('distance to ocean', axis=1)
predicted_data_frame = pd.DataFrame(predictions.T, columns=['housing 
median'])
# new object meant to have the unique key for the usage of merge/join 
# func
add_to_plot_test_data = test_data[['longitiude']].copy()
# since it does not have the 'key' to proceed with join or merge
# I used concat()
add_to_plot_test_data = pd.concat([add_to_plot_test_data, 
predicted_data_frame], axis=1)
# merging two dataframes to get 'housing median' column
plot_test_data = 
plot_test_data.merge(add_to_plot_test_data,on='longitiude',how='outer')

但不幸的是它根本不起作用,结果是:

#######
add_to_plot_test_data
#######
             longitiude        housing median
0                   NaN          85657.901920
1                   NaN         305492.607375
2                   NaN         152056.461225
3                   NaN         186095.709461
4                   NaN         244550.679661
2908            -119.04                   NaN
12655           -121.46                   NaN
14053           -117.13                   NaN
15502           -117.23                   NaN
20496           -118.70                   NaN

问题是我不知道如何将列“加入”这些行。

【问题讨论】:

  • join 通过密钥完成其工作。这两者是否具有相同的键值?对于plot_test_data 中的每一行,predictions 中是否只有一项?也许你只需要plot_test_data['housing median'] = predictions.T
  • 啊,我不知道。谢谢。我会尝试对其进行实验,完成后我会告诉你它是如何进行的。
  • @TimRoberts 我想我知道问题出在哪里。但不幸的是,我不知道如何解决它。由于 test_data 正在被随机洗牌,因此随机选择了 5 个“值”到集合中。当我在新创建的名为 'add_to_test_plot_data' 的对象上使用 'pd.concat()' 时,它意味着让 '.join()' 函数起作用,我看到了这个:^(post edit)

标签: python pandas dataframe


【解决方案1】:

我最初的建议是将predictions 添加为一列就可以了:

import pandas as pd
x = [2908,12655,14053,15502,20496]
y = [-119.04,-121.46,-117.13,117.23,-118.70]
z = [85658.9,305492.6,152056.4,186095.7,244550.7]
df1 = pd.DataFrame(y,columns=['longitude'],index=x)
print(df1)
df1['housing median'] = z
print(df1)

输出:

       longitude
2908    -119.040
12655   -121.460
14053   -117.130
15502   -117.230
20496   -118.700
       longitude  housing median
2908    -119.040         85658.9
12655   -121.460        305492.6
14053   -117.130        152056.4
15502   -117.230        186095.7
20496   -118.700        244550.7

【讨论】:

  • 谢谢!与此同时,我正在试验,我也找到了一个解决方案,也许没有你的那么温和,但它确实有效。再次感谢您的帮助。
猜你喜欢
  • 2020-10-25
  • 2019-06-15
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 2018-11-23
  • 2014-08-10
相关资源
最近更新 更多