【问题标题】:How to completely ignore whitespaces in csv with Pandas如何使用 Pandas 完全忽略 csv 中的空格
【发布时间】:2016-03-03 19:12:19
【问题描述】:

我正在尝试以最低限度的人类可读性和易于熊猫可读的格式制作 .csv 文件。这意味着列应该被整齐地分开,以便您可以轻松识别每个值属于哪一列。问题是,用空格填充它会削弱 pandas 的功能。到目前为止,我得到的是

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,这是一个很大的改进。但是,列名和布尔列仍然是带有空格的字符串。

有什么方法可以直接用 pandas 读取 .csv 文件吗?或者也许是 csv 格式的机会,并且仍然可以使用人类可读的 .csv 进行干净读取?

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

【问题讨论】:

标签: python csv pandas


【解决方案1】:

试试这个:

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(请参阅我的评论中的详细信息)...

【讨论】:

  • 我觉得应该是pd.read_csv('bibrev.csv', sep='\s+,', index_col=0)吧?但它工作得非常好,只是布尔列是一个字符串,而不是布尔值。
  • @TomCho,“当通过重新索引或其他方式将 NA 引入现有 Series 或 DataFrame 时,布尔和整数类型将被提升为不同的 dtype 以存储 NA” - pandas.pydata.org/pandas-docs/stable/gotchas.html .所以你首先要摆脱 NaN...
  • 其实你的新答案正是我所需要的。那是正则表达式,对吧?
  • @TomCho,是的,它是正则表达式,无论你是否有空格,它都应该可以工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 2022-01-14
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多