【问题标题】:selecting columns for scatter plot from csv从csv中选择散点图的列
【发布时间】:2022-01-07 11:16:35
【问题描述】:

我正在尝试从大型 csv 制作散布矩阵,散布矩阵在较小的文件上运行良好,但是将其应用于较大的文件时,我无法获得正确的列输出,它只返回 2 之一散点图,当我尝试增加从哪里开始选择的数量时,会在输出中引发错误:

    Traceback (most recent call last):
  File "C:\Users\Kinkerman\Downloads\Uni\Data Analytics\Python\Python files wk 5\scatter_matrix2.py", line 8, in <module>
    scatter_matrix(data.loc[:, "V5":"V8"], diagonal="kde")
  File "C:\Users\Kinkerman\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\plotting\_misc.py", line 128, in scatter_matrix
    return plot_backend.scatter_matrix(
  File "C:\Users\Kinkerman\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\plotting\_matplotlib\misc.py", line 50, in scatter_matrix
    fig, axes = create_subplots(naxes=naxes, figsize=figsize, ax=ax, squeeze=False)
  File "C:\Users\Kinkerman\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\plotting\_matplotlib\tools.py", line 267, in create_subplots
    ax0 = fig.add_subplot(nrows, ncols, 1, **subplot_kw)
  File "C:\Users\Kinkerman\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\figure.py", line 772, in add_subplot
    ax = subplot_class_factory(projection_class)(self, *args, **pkw)
  File "C:\Users\Kinkerman\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\axes\_subplots.py", line 36, in __init__
    self.set_subplotspec(SubplotSpec._from_subplot_args(fig, args))
  File "C:\Users\Kinkerman\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\gridspec.py", line 597, in _from_subplot_args
    gs = GridSpec._check_gridspec_exists(figure, rows, cols)
  File "C:\Users\Kinkerman\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\gridspec.py", line 225, in _check_gridspec_exists
    return GridSpec(nrows, ncols, figure=figure)
  File "C:\Users\Kinkerman\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\gridspec.py", line 385, in __init__
    super().__init__(nrows, ncols,
  File "C:\Users\Kinkerman\AppData\Local\Programs\Python\Python310\lib\site-packages\matplotlib\gridspec.py", line 52, in __init__
    raise ValueError(
    ValueError: Number of columns must be a positive integer, not 0ValueError: Number of columns must be a positive integer, not 0

这是我目前的代码:

    import pandas as pd
    import matplotlib.pyplot as plt
    from pandas.plotting import scatter_matrix

    #read from file and rename columns "Vi"
    data = pd.read_csv('principal_offence_category_april_2014.csv')
    data.columns = ["V"+str(i) for i in range(1, len(data.columns)+1)]

    #select columns and plot in the scatter matrix
    scatter_matrix(data.loc[:, "V5":"V8"], diagonal="kde")
    plt.tight_layout()
    plt.show()

这是我正在使用的文件 >>> https://drive.google.com/file/d/1X6PN_EtMpspazVxI6d3h3J08NWQIb11Y/view?usp=sharing

【问题讨论】:

  • 请将您的 CSV 文件的前几行添加到您的问题中(作为文本),以便我们重新创建问题
  • V5-V8 是字符串列吗?关于这些专栏,print(data.info()) 告诉你什么?
  • @Mr.T V5-V8 是我要为散布矩阵选择的列,我不确定您所说的 `` print(data.info()) 是什么意思` 因为它不在我的代码中。我假设它会返回有关列中项目的详细信息??
  • 确实如此。从它的输出可以看出,正如预期的那样,V5-V8 是 dtype 对象的非数字列。在文件的导入过程中,pandas 会检查每一列可以假设的数据类型,显然像“21%”这样的数据不能安全地假设为数值,因此将整列声明为对象。在绘制散点矩阵时,matplotlib 仅考虑具有数值的列。由于在 V5-V8 范围内没有提供任何内容,因此它会返回您发布的错误消息。
  • @Mr.T 但为什么 V1 和 V3 不这样做???

标签: python csv matplotlib


【解决方案1】:

您可以使用thousands 参数指定使用,,并使用na_values- 转换为NaN 值。然后,您需要一种将% 条目转换为浮点数的方法。例如:

data['V5'] = data['V5'].str.rstrip('%').astype('float')

这可以应用于某些百分比列:

import pandas as pd
import matplotlib.pyplot as plt
from pandas.plotting import scatter_matrix

#read from file and rename columns "Vi"
data = pd.read_csv('principal_offence_category_april_2014.csv', thousands=',', na_values=['-'])
data.columns = [f"V{i}" for i in range(1, len(data.columns)+1)]
cols = [f'V{col}' for col in range(3, 12, 2)]       # e.g. percentage columns  V3, V5, V7, V9, V11

for col in cols:
    data[col] = data[col].str.rstrip('%').astype('float')

#select columns and plot in the scatter matrix
scatter_matrix(data[cols], diagonal="kde")
plt.tight_layout()
plt.show()      

它会为您的文件提供以下输出:

【讨论】:

  • 我猜它在V1和V3上返回的错误是因为空格?
  • V1 是一个文本字段
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2018-11-18
  • 2020-05-25
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多