pandas 同一列中包含布尔值和“0”和/或“1”的Excel文件未使用read_excel正确导入

pgccezyw  于 2023-02-17  发布在  其他
关注(0)|答案(3)|浏览(137)

我需要导入一个excel工作表,就像在Pandas中的数据框中一样。当使用read_excel函数与dtype=object时,我仍然得到"解释"的值。
我在水蟒环境中使用Python 3.5.4,Pandas0.23.4。
我的(测试)excel工作表:

header1 header2 header3 header4 header5 header6 mixed
word11  word12  word13  word14  word15  word16  word17
word21  word22  word23  word24  word25  word26  word27
TRUE    1       FALSE   0       TRUE    1       TRUE
word41  word42  word43  word44  word45  word46  0
0       TRUE    0       TRUE    TRUE    0       FALSE
1       FALSE   1       FALSE   FALSE   1       1
word71  word72  word73  word74  word75  word76  word77

所以我导入并打印:

sheets_dict = pd.read_excel(reqFile, sheet_name=[1],dtype=object)
sheets_dict[list(sheets_dict.keys())[0]]

导入的 Dataframe :

header1 header2 header3 header4 header5 header6   mixed
0  word11  word12  word13  word14  word15  word16  word17
1  word21  word22  word23  word24  word25  word26  word27
2    True       1   False       0    True       1    True
3  word41  word42  word43  word44  word45  word46       0
4       0       1   False    True    True       0       0
5    True   False       1       0   False       1    True
6  word71  word72  word73  word74  word75  word76  word77

色谱柱1:
对于包含True且后跟1的列,1也会作为True加载到 Dataframe 中。
第2列:
相反的情况也会发生:如果1首先出现在列中,随后出现True,则True在 Dataframe 中被加载为1
第3列:
False使所有后续的0都转换为False
第4列:
对列3
第5/6列:
一切顺利
第7列:
第一个True将所有后续的1转换为True,而第一个0将所有后续的False转换为0
我怎样才能强制read_excel不解释任何东西,并按原样读取Excel工作表?如有任何帮助,我将不胜感激。

093gszye

093gszye1#

你可以强制Pandas将列类型设置为str,而不是以不可预知的方式自动转换为布尔型和整型。如果这样做有效,你可以插入一个条件,这样只有“TRUE”和“FALSE”被转换为布尔型,数字1和0被转换为整型。converters参数接受一个字典。

'df = pd.read_excel('test.xlsx', sheetname='Sheet1', header=0,          
                    converters={'header1':str,'header2':str})'
qnakjoqk

qnakjoqk2#

因此,为了强制我所需要的,我做了以下操作:

sheets_dict = pd.read_excel(reqFile, sheet_name=[1],dtype=object)
keys = sheets_dict[list(sheets_dict.keys())[0]].keys()
values = [str] * len(keys)
convertDict = dict(zip(keys, values))
sheets_dict = pd.read_excel(reqFile, sheet_name=[1],dtype=object,converters=convertDict)

像这样,我得到了我的Excel工作表的确切副本:

header1 header2 header3 header4 header5 header6   mixed
0  word11  word12  word13  word14  word15  word16  word17
1  word21  word22  word23  word24  word25  word26  word27
2    True       1   False       0    True       1    True
3  word41  word42  word43  word44  word45  word46       0
4       0    True       0    True    True       0   False
5       1   False       1   False   False       1       1
6  word71  word72  word73  word74  word75  word76  word77

唯一的缺点是我需要读两遍表格。

31moq8wy

31moq8wy3#

我也遇到过类似的问题,我使用了Werner的解决方案,但我认为我改进了它,包括nrows=0应该可以减少两次读取数据的问题。

dataFrame = pandas.read_excel(workbook, sheetName, dtype=object, nrows=0)
converters = {column:str for column in dataFrame.columns}
dataFrame = pandas.read_excel(workbook, sheetName, converters=converters)

尝试用Pandas读字符串有一些有趣的历史,目前仍在研究中:https://github.com/pandas-dev/pandas/issues/20377
https://pandas.pydata.org/docs/user_guide/text.html
我个人觉得奇怪的是dtype=str并没有给予你所有的字符串值,为什么你必须为每一列创建一个转换器,它们表达的是完全相同的内容呢?

相关问题