如何将两个DataFrame对应列逐一绘制散点图并解决尺寸不匹配错误?
问题解决方法
首先,你的代码存在两个核心问题:
DataFrame定义错误:创建
df_A和df_B时,你误用了小写的a和b,但字典变量名是大写的A和B,这会直接触发NameError,先修正这一点:import pandas as pd import matplotlib.pyplot as plt import numpy as np # 需要导入numpy来识别nan A = {'col1': [20, 3, 45.6, 2, 500, 3e45, np.nan], 'col2': [np.nan, 90, 1e3, np.nan, 78, 6, np.nan],'col3':[25, 7e56, np.nan, np.nan, 23, 0.4, 78.04]} B = {'a': [1, 24, 30, np.nan, np.nan, 56, 2.5], 'b': [100, np.nan, 10, 78.09, 1e29, 0.84, np.nan],'c': [np.nan, 4.6, np.nan, np.nan, 9e45, 0.2, np.nan] } df_A = pd.DataFrame(data=A) # 修正为大写A df_B = pd.DataFrame(data=B) # 修正为大写B列名不匹配导致索引错误:
df_A的列名是col1/col2/col3,而df_B的列名是a/b/c,你循环时用df_A的列名去索引df_B,自然找不到对应列,进而引发数据尺寸不匹配的错误。要实现“第1列对第1列、第2列对第2列”的配对,需要按列的顺序关联两个DataFrame的列。
正确代码实现
下面是两种可行写法,都会处理NaN值(避免散点图忽略无效数据的警告),并设置正确的坐标轴标签:
方法一:按列的位置索引配对
for i in range(len(df_A.columns)): # 获取对应位置的列名 x_col = df_A.columns[i] y_col = df_B.columns[i] # 合并两列并过滤掉含NaN的行 valid_data = pd.concat([df_A[x_col], df_B[y_col]], axis=1).dropna() # 绘制单独的散点图 plt.figure() plt.scatter(valid_data[x_col], valid_data[y_col]) plt.xlabel(x_col) plt.ylabel(y_col) plt.title(f"Scatter Plot: {x_col} vs {y_col}") plt.show()
方法二:用zip打包列名配对
# 按顺序打包两个DataFrame的列名 for col_a, col_b in zip(df_A.columns, df_B.columns): # 过滤掉含NaN的行,确保x/y数据长度一致 valid_data = df_A[[col_a]].join(df_B[[col_b]]).dropna() # 绘制散点图 plt.figure() plt.scatter(valid_data[col_a], valid_data[col_b]) plt.xlabel(col_a) plt.ylabel(col_b) plt.title(f"Scatter Plot: {col_a} vs {col_b}") plt.show()
关键说明
- 用
dropna()过滤含NaN的行,确保散点图的x、y数据长度完全匹配,从根源解决尺寸不匹配问题。 - 每个配对生成单独的图(
plt.figure()),如果想把所有散点图画在同一张图里,可以去掉plt.figure()和plt.show(),添加label参数后最后调用plt.legend()统一展示图例。
内容的提问来源于stack exchange,提问作者Viky E.
相关产品推荐
相关产品推荐

