如何使用Pandas完全忽略csv中的空格

发布于 2021-01-29 15:05:02

我正在尝试将.csv文件制作成既易于阅读又易于熊猫阅读的格式。这意味着列应该整齐地分开,以便您可以轻松识别每个值所属的列。问题是,用空格填充它会降低熊猫功能。到目前为止,我所拥有的是

work    ,roughness  ,unstab ,corr_c_w   ,u_star ,c_star
us      ,True       ,True   ,-0.39      ,0.35   ,-.99
wang    ,False      ,       ,-0.5       ,       ,
cheng   ,           ,True   ,           ,       ,
watanabe,           ,       ,           ,0.15   ,-.80

如果我取出上面.csv上的所有空格,并直接将pd.read_csv其读取,则效果很好。前两列为布尔值,其他为浮点数。但是,如果没有空格,则根本无法让人理解。当我阅读上面的.csv

pd.read_csv('bibrev.csv', index_col=0)

这是行不通的,因为显然所有的列和字符串都包含空格。当我使用

pd.read_csv('bibrev.csv', index_col=0, skipinitialspace=True)

那么这是可行的,因为浮点数被读取为浮点数,缺失值被读取为NaNs,这是一个很大的改进。但是,列名和布尔列仍然是带空格的字符串。

有什么直接用熊猫读取.csv的方法吗?还是可能会有点csv格式,并且仍然可以通过人类可读的.csv清晰阅读?

PS
.:我试图避免使用python作为字符串读取所有内容,替换空白,然后将其提供给pandas,并且还尝试避免定义某些函数并将其通过converters关键字传递给pandas


关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    尝试这个:

    import pandas as pd
    
    def booleator(col):
        if str(col).lower() in ['true', 'yes']:
            return True
        #elif str(col).lower() == "false":
        #    return False
        else:
            return False
    
    df = pd.read_csv('data.csv', sep='\s*,\s*', index_col=0,
                     converters={'roughness': booleator, 'unstab': booleator},
                     engine='python')
    print(df)
    print(df.dtypes)
    

    输出:

             roughness unstab  corr_c_w  u_star  c_star
    work
    us            True   True     -0.39    0.35   -0.99
    wang         False  False     -0.50     NaN     NaN
    cheng        False   True       NaN     NaN     NaN
    watanabe     False  False       NaN    0.15   -0.80
    roughness       bool
    unstab          bool
    corr_c_w     float64
    u_star       float64
    c_star       float64
    dtype: object
    

    这个版本也照顾布尔值-所有NaN都将转换为False,否则Pandas会将dtype提升为Object(请参阅我的评论中的详细信息)…



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看