【问题标题】:Parsing an xlsx file into a dictionary将 xlsx 文件解析为字典
【发布时间】:2017-09-23 19:13:59
【问题描述】:

我正在尝试解析一个非常简单的xlsx 文件。它有 4 张表格,格式如下:lookup table。我正在为此使用熊猫。

这是我想做的:

xls = pandas.ExcelFile('file.xlsx')
for sheet in xls.sheet_names:
    cur_sheet=xls.parse(sheet)
    cur_sheet=set_index(sheet)
    dic = cur_sheet.to_dict('index')

问题:

  1. 一切都是unicode,因此有一个“u”前缀,这在与其他字符串比较和在字典中设置值时会出现问题。我就是无法摆脱它。
  2. 我希望字典只接受非 Nan 值
  3. 有没有一种漂亮的方法可以在没有计数器的情况下使用“sheet”作为工作表的名称?即:

    counter=0
    for sheets in xls.sheet_names
         cur_sheet=xls.parse(xls.sheet_names[counter])
    

我觉得真的很丑……

  1. 理想情况下,我只想要一个字典(所有工作表的第一列都相同)

我对 Python 还是很陌生,而且它对我来说真的很不直观。我在网上搜索了一整天,并没有真正找到正常的解决方法。

谢谢!

【问题讨论】:

  • ps。我希望左列成为字典的“键”(由所有 sheetS 共享)
  • 真的,您的问题应该一次只关注一件事。第 (3) 点与您的问题并没有真正的关联,并且是唯一一个我有信心回答并让开的问题。摆脱counter,直接使用sheets,虽然我建议将其重命名为sheet,因为它是单数的,有助于理解。所以,for sheet in xls.sheet_names: cur_sheet = xls.parse(sheet).
  • 点了,我会做的。关于反击问题。您的建议(也是我的第一个猜测)适用于 xls.parse,但不适用于 cur_sheet.set_index(sheet)。部分原因是(我的猜测)这张纸被读作 u'Bla' 而不仅仅是 'Bla' 所以它找不到它

标签: python excel pandas parsing dictionary


【解决方案1】:

让我们一个接一个。 我重新创建了您的 .xlsx 文件,如图所示,并添加了对如何将文件读入 pandas 数据框的更改。 1.您可以通过以下方式使用applymap

import pandas as pd
pd.set_option('expand_frame_repr', False)
dataframe = pd.read_excel('file.xlsx', sheetname = name, header = 0, index_col = 0) 
dataframe.applymap(lambda x: x.strip('u'))

它应用了在数据帧的每个单元格中去掉“u”的函数,

2.dropna() 去掉 NaN 值。

3.这就是你以pythonic方式循环的方式

xls = pd.ExcelFile('file.xlsx')
sheets = xls.sheet_names

for sheet in sheets:
     #your code

让我们将它们组合在一起:

import pandas as pd
xls = pd.ExcelFile('file.xlsx')
sheets = xls.sheet_names
for sheet in sheets:
    dataframe = pd.read_excel('file.xlsx', sheetname = sheet)
    dataframe = dataframe.dropna()
    dataframe.applymap(lambda x: x.strip('u'))

4.我没有真正明白这个问题,所以我无能为力。

根据cmets中的对话..

import pandas as pd
df = pd.read_excel('file.xlsx', sheetname = name, header = 0, index_col = 0)
cols = df.columns
the_list = list()
for col in cols:
    print(df[~df[col].isnull()].index.tolist())
    column = (col, df[~df[col].isnull()].index.tolist())
    the_list.append(column)

此代码打开您的文件,然后遍历列并为包含列 ID 和行 ID 列表的每一列创建一个元组。因此,如果您在第 2_3 列和第 3_0 行中有 x,则元组将如下所示:('2_3', ['3_0'])。这是你真正想做的吗?

【讨论】:

  • 1 没有帮助,我得到这个:AttributeError: ("'float' object has no attribute 'strip'", u'occurred at index 3_11')
  • 好吧,你说你到处都有'u',所以我假设你到处都有字符串,错误意味着那里也有浮动。所以请澄清那些“你”到底在哪里。
  • 我附上了一张我的桌子的照片。我的第一条消息中的“查找表”。 'u's 用于 unicode 格式
  • 给我 5 分钟,我将制作与您完全相同的文件并修复代码。
  • @NoaRegev 尝试以下操作。第 1 行:a = 'hello'。第 2 行:b = u'hello'。第 3 行:print a == b。这是True
猜你喜欢
  • 2021-04-11
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 2018-04-02
  • 2017-07-21
相关资源
最近更新 更多