【问题标题】:Columns Not Assigned Properly in Pandas (Python)Pandas (Python) 中未正确分配的列
【发布时间】:2020-02-24 22:04:44
【问题描述】:

我在 .csv 文件中有一个数据集,我正在尝试提取并命名它的列。我使用以下代码:

data_name = 'housing.csv'
column_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX',
                                 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO',
                                 'LSTAT', 'MEDV']
data = pd.read_csv(data_name, names=column_names, error_bad_lines=False,
                   header=None)

问题在于它将标题分配给了错误的列。只有最后一列被重命名并添加其他列,并填充 NaN 值。我也尝试过使用rename 得到类似的结果。这是print(data.head()) 的样子:

                                                CRIM  ZN  ...  LSTAT  MEDV
0   0.00632  18.00   2.310  0  0.5380  6.5750  65... NaN  ...    NaN   NaN
1   0.02731   0.00   7.070  0  0.4690  6.4210  78... NaN  ...    NaN   NaN
2   0.02729   0.00   7.070  0  0.4690  7.1850  61... NaN  ...    NaN   NaN
3   0.03237   0.00   2.180  0  0.4580  6.9980  45... NaN  ...    NaN   NaN
4   0.06905   0.00   2.180  0  0.4580  7.1470  54... NaN  ...    NaN   NaN

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您的文本数据似乎是用空格而不是逗号分隔的。

    您可以尝试明确告诉read_csv 使用一个或多个空格作为字段分隔符:

    data = pd.read_csv(data_name, names=column_names, error_bad_lines=False,
                       header=None, sep='\s+')
    

    read_csv 中还有一个显式的delim_whitespace 选项,其作用与上述相同。来自docs

    delim_whitespace: bool,默认为 False

    指定是否将空格(例如' '' ')用作sep。相当于设置sep='\s+'。如果此选项设置为 True,则不应为 delimiter 参数传递任何内容。

    【讨论】:

    • 是否需要将分隔符指定为原始字符串 (r'\s+')? @foglerit
    • @Todd:好问题。我只是在使用和不使用原始字符串的情况下进行了测试,发现行为没有差异。你的行为有什么不同吗?
    • 是的。我确实注意到它不一样。如果没有r,Python interp 会将反斜杠视为转义。对于r,它将其视为有效的正则表达式语句。我在这里有一个使用相同 expr 的示例stackoverflow.com/a/60368867/7915759,您可以尝试使用 read_csv() 将我在那里显示的文本转换为带有和不带有 'r' 的数据框
    • 是的,我知道 python 如何解释字符串和原始字符串中的反斜杠。我的意思是,如果您在 read_csv 中发现使用与不使用之间有什么区别。我刚刚在您的链接 没有 r 的情况下运行了示例,并且它有效。此外,read_csv 文档建议使用sep='\s+',而不是sep=r'\s+'pandas.pydata.org/pandas-docs/stable/reference/api/…——检查选项delim_whitespace
    • 无论“它是否有效”,'\s+' 都是错误的正则表达式。您需要在字符串前面的 'r' 告诉 interp 将反斜杠视为普通字符。或者,您也可以输入“\\s+”。 @foglerit
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    相关资源
    最近更新 更多