我需要将一个非常大的 Excel 文件读入 DataFrame。该文件包含字符串、整数、 float 和 bool 数据,以及缺失数据和完全空行。可能还值得注意的是,一些单元格值是从单元格公式和/或 VBA 派生的 - 尽管理论上这不应该影响任何东西。
正如标题所说,pandas 有时会将 bool 值读取为 float 或 int 1 和 0,而不是 True 和 False。它似乎与空行的数量和其他数据的类型有关。为简单起见,我只是链接了一个复制了问题的 2 页 Excel 文件。 Boolean_1.xlsx
代码如下:
import pandas as pd
df1 = pd.read_excel('Boolean_1.xlsx','Sheet1')
df2 = pd.read_excel('Boolean_1.xlsx','Sheet2')
print(df1, '\n' *2, df2)
这是打印品。主要注意 ZBA 行,它在两个工作表中具有相同的值,但在 DataFrames 中具有不同的值:
Name stuff Unnamed: 1 Unnamed: 2 Unnamed: 3
0 AFD a dsf ads
1 DFA 1 2 3
2 DFD 123.3 41.1 13.7
3 IIOP why why why
4 NaN NaN NaN NaN
5 ZBA False False True
Name adslfa Unnamed: 1 Unnamed: 2 Unnamed: 3
0 asdf 6.0 3.0 6.0
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
4 NaN NaN NaN NaN
5 ZBA 0.0 0.0 1.0
我也能够在我实际处理的大文件中获得整数 1 和 0 的输出 (yay),但无法轻松复制它。
可能导致这种不一致的原因是什么,有没有办法强制 pandas 按应读取的方式读取 bool 值?
最佳答案
Pandas 类型转换按列/系列应用。一般来说,Pandas 不能很好地处理混合类型,或者 object
dtype。您应该期望内化逻辑来确定系列的最有效数据类型。在这种情况下,Pandas 选择了适用于包含 float
和 bool
值的系列的 float
dtype。在我看来,这是高效而简洁的。
但是,正如您所指出的,当您拥有转置输入数据集时,这将不起作用。让我们从头开始设置一个示例:
import pandas as pd, numpy as np
df = pd.DataFrame({'A': [True, False, True, True],
'B': [np.nan, np.nan, np.nan, False],
'C': [True, 'hello', np.nan, True]})
df = df.astype({'A': bool, 'B': float, 'C': object})
print(df)
A B C
0 True NaN True
1 False NaN hello
2 True NaN NaN
3 True 0.0 True
选项 1:更改“行数据类型”
您可以在不转置数据的情况下更改一行中对象的数据类型。这将强制系列 B 具有 object
dtype,即一系列存储指向任意类型的指针:
df.iloc[3] = df.iloc[3].astype(bool)
print(df)
A B C
0 True NaN True
1 False NaN hello
2 True NaN NaN
3 True False True
print(df.dtypes)
A bool
B object
C object
dtype: object
选项 2:转置并转换为 bool 值
在我看来,这是更好的选择,因为数据类型被附加到特定类别/输入数据系列。
df = df.T # transpose dataframe
df[3] = df[3].astype(bool) # convert series to Boolean
print(df)
0 1 2 3
A True False True True
B NaN NaN NaN False
C True hello NaN True
print(df.dtypes)
0 object
1 object
2 object
3 bool
dtype: object
关于python - Pandas.read_excel 有时会错误地将 bool 值读取为 1's/0' s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51661980/