2

我正在学习推荐 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 列作为 FALSE、FALSE、TRUE、TRUE 类型进入 df

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

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

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

这是我的数据: 链接

代码如下:
from pandas import *
import numpy as np
import pandas as 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)  

和输出链接

4

2 回答 2

2

您可以使用 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)})
于 2012-10-18T14:45:25.697 回答
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')])
于 2012-11-17T21:30:06.617 回答