【问题标题】:Python Pandas Mixed Boolean Yes/True and NaN ColumnsPython Pandas 混合布尔值 Yes/True 和 NaN 列
【发布时间】:2012-10-08 11:46:05
【问题描述】:

我正在学习推荐 R 或 Stata 的健康科学课程。我正在尝试使用 Python / Numpy / Pandas,因为我希望将来将其用于金融时间序列分析。

数据是 Stata 格式,所以我复制了这些字段并将它们保存为 CSV。 所有字段导入都很好,只是有一些是/否列,其中一些有空白字段。

导入命令是

fhs = pd.io.parsers.read_csv('F:\\BioStatistics\\fds\\fhs_c2.csv', header=0, index_col=0)

如果有空白字段,则 dtype 为对象(有意义)

如果没有空格,则某些列将转换为 TRUE/FALSE,其他列将保留为 Yes/No,但 dtype 为 bool。知道为什么吗?

我希望全部使用一种 dtype 并表达一种查看 + 统计分析的方式。

我通过在开头添加一行空白单元格来为没有空格的布尔列添加一行来实现这一点 - 所以一切都变成了一个对象。然后我用 fhs = fhs.drop([1002]) 删除该行并且数据类型仍然很好。

我很想在没有这一行的情况下保存它,并且每次都能够使用“正确”类型加载数据,但不知道是否有可能何时某些列将全部是或否,有些将有空白单元格。有可能吗?

谢谢,对于新手的问题很抱歉。

示例:

导入

      C1    C2    C3

R1   Yes   Yes    No

R2    No    No    No

R3   Yes         Yes

R4   Yes   Yes   Yes

第一列进入 df 为 Yes, No, Yes, Yes 在下面输入 bool xxxx

第 2 列进入 df 为 Yes、No、NaN、Yes 类型对象

第 3 列进入 df 为 FALSE、FALSE、TRUE、TRUE 类型 bool

该死的。刚检查。我错了。如果是和否,则列类型为对象。

我想在导入时告诉它以使它们全部成为对象并坚持是和否,因为: 1.我认为第二列必须是对象(否则我认为它是混合的) 2. 数据集是/否,其他班级成员将查看是和否

当我尝试解决方案时发生了什么。

这是我的数据:link

代码如下:
从熊猫进口 *
将 numpy 导入为 np
将熊猫导入为 pd

def convert_bool(col):
    if str(col).title() ==  "True": #check for nan
        return "Yes"
    elif str(col).title() == "False":
        return "No"
    else:
        return col

fhs = pd.read_csv('F:\\BioStatistics\\fds\\StatExport.csv', converters={"death": lambda x:convert_bool(x)}, header=0, index_col=0)  

并输出link

【问题讨论】:

  • 请举例说明问题的数据。
  • 示例:导入 C1 C2 C3 R1 是 是 否 R2 否 否 否 R3 是 是 R4 是 是 是 第一列进入 df 为是,否,是,是类型 bool xxxx 下面的第二列进入df 为 Yes, No, NaN, Yes 类型对象第 3 列进入 df 为 FALSE、FALSE、TRUE、TRUE 类型 bool 该死。刚检查。我错了。如果是和否,则列类型为对象。

标签: python import pandas


【解决方案1】:

您可以使用 pandas.read_csv 中的转换器字段

def convert_bool(col):
    if str(col).title() ==  "True": #check for nan
        return "YES"
    elif str(col).title() == "False":
        return "NO"
    else:
        return col
pandas.read_csv(file_in, converters={"C3": lambda x:convert_bool(x)})

【讨论】:

  • 谢谢@Michael,这样就可以了。
  • 抱歉,我似乎无法格式化这些 cmets。我已将代码和结果添加到原始帖子的末尾。
  • 约翰,看起来不错。看起来是这样的,因为你被randid索引了
  • 去掉index_col=0会排成一行
  • 谢谢迈克尔,这里的人很好。我只需要掌握董事会的技术。
【解决方案2】:

注意在即将发布的 pandas 0.9.2(其中包括一个新的文件解析器引擎)中,您将能够做到:

In [1]: paste
data = """A,B,C
Yes,No,Yes
No,Yes,Yes
Yes,,Yes
No,No,No"""

result = read_csv(StringIO(data), dtype=object)
## -- End pasted text --

In [2]: result
Out[2]: 
     A    B    C
0  Yes   No  Yes
1   No  Yes  Yes
2  Yes  NaN  Yes
3   No   No   No

In [3]: result = read_csv(StringIO(data), dtype=object, na_filter=False)

In [4]: result
Out[4]: 
     A    B    C
0  Yes   No  Yes
1   No  Yes  Yes
2  Yes       Yes
3   No   No   No

甚至(得到一个 NumPy 数组):

In [5]: result = read_csv(StringIO(data), dtype='S3', na_filter=False, as_recarray=True)

In [6]: result
Out[6]: 
array([('Yes', 'No', 'Yes'), ('No', 'Yes', 'Yes'), ('Yes', '', 'Yes'),
       ('No', 'No', 'No')], 
      dtype=[('A', '|S3'), ('B', '|S3'), ('C', '|S3')])

【讨论】:

  • 谢谢韦斯。欣赏指针。现在到 Python 3.3.1 上的 Pandas 11 和它的辉煌 - 感谢团队。
猜你喜欢
  • 1970-01-01
  • 2017-11-30
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 2013-01-09
  • 2019-02-09
  • 2012-08-21
相关资源
最近更新 更多