【问题标题】:How to convert the given Excel file to a dictionary in Python?如何将给定的 Excel 文件转换为 Python 中的字典?
【发布时间】:2021-07-01 20:30:14
【问题描述】:

Excel数据格式:

文件,转换为 csv,内容如下:

{'Details': {0: 'Mickey',
  1: nan,
  2: nan,
  3: nan,
  4: 'Doland',
  5: nan,
  6: nan,
  7: nan},
 'Unnamed: 1': {0: 'Mouse',
  1: nan,
  2: nan,
  3: nan,
  4: nan,
  5: nan,
  6: nan,
  7: nan},
 'Unnamed: 2': {0: 'Address1',
  1: 'city',
  2: 'street',
  3: 'hno',
  4: 'adress1',
  5: 'city',
  6: 'street',
  7: 'hno'},
 'Unnamed: 3': {0: nan, 1: 'xxx', 2: 2, 3: 22, 4: nan, 5: 'zzz', 6: 3, 7: 33},
 'Unnamed: 4': {0: 'address2',
  1: 'city',
  2: 'street',
  3: 'hno',
  4: 'address2',
  5: 'city',
  6: 'street',
  7: 'hno'},
 'Unnamed: 5': {0: nan, 1: 'yyy', 2: 3, 3: 33, 4: nan, 5: 'www', 6: 4, 7: 44}}

如何将附加的 Excel 转换为 Python 中的字典?

预期的字典:

dict1 ={'Details':[['Mickey','Mouse',{'Address1': {'city': 'xxx', 'Street': '2', 'hno': '22'}},
                    {'Address2': {'city': 'yyy', 'Street': '3', 'hno': '33'}}],
                   ['Doland','Duck',{'Address1': {'city': 'xxx', 'Street': '2', 'hno': '22'}},
                    {'Address2': {'city': 'yyy', 'Street': '3', 'hno': '33'}}]]}

【问题讨论】:

标签: python excel pandas dictionary


【解决方案1】:

这是我能想到的最糟糕的解决方案:

df = pd.read_excel('samp.xlsx', header=[0], 
                   index_col=[0,1])
d = {'details': []}
for i, grp in df.groupby('Details'):
    grp = (grp.T.ffill().T)
    grp.columns = grp.iloc[0]
    grp = grp[1:].T
    name = ', '.join(grp.index.name)
    val = grp.groupby(grp.index).apply(lambda x: dict(zip(x.iloc[0], x.iloc[1]))).to_dict()
    final_val = ([name,val])
    d['details'].append(final_val)

d:

{'details': [['Donald, Duck',
   {'Address1': {'City': 'zzz', 'Street': 3, 'hno': 33},
    'Address2': {'City': 'www', 'Street': 4, 'hno': 44}}],
  ['Mickey, Mouse',
   {'Address1': {'City': 'xxx', 'Street': 2, 'hno': 22},
    'Address2': {'City': 'yyy', 'Street': 3, 'hno': 33}}]]}

我已经在评论区发布了excel文件的链接。

基本上,我对每个按名称访问每个组(米老鼠和唐老鸭)使用 z 循环,然后我对其应用操作。

对不起,我着急稍后会添加解释。如果您在理解事情上有困难,请告诉我。

这个月牙:

grp.T.ffill().T 

将帮助我用 Address1/Address2 填充 nan 值。这就是我转置它然后使用ffill的原因。

之后,我想将每个组的起始行作为列。 一旦这一步完成。我的第一行将是关键,第二行将是我的价值。所以我将它们压缩在一起并创建了一本字典。希望这可以帮助您更好地理解逻辑。

【讨论】:

  • 感谢您的出色解决方案!它有效,但我无法理解 for 循环中的前 3 行 grp = (grp.T.ffill().T) grp.columns = grp.iloc[0] grp = grp[1:].T 你能更详细地了解这些步骤吗?并在您有时间时提供您的最佳解决方案版本。
  • @speed0001:还要检查图像。我已经添加了解释。请在每一步打印输出。
【解决方案2】:
import xlrd
from xlrd import open_workbook

fp = tempfile.NamedTemporaryFile(delete= False, suffix=filetype)
fp.write(binascii.a2b_base64(selected file))
workbook = xlrd.open_workbook(file name)
sheet = workbook.sheet_by_name(sheet name)
row = [c or '' for c in sheet.row_values(header_row)]
first_row = [] 
 for col in range(sheet.ncols):
    first_row.append(sheet.cell_value(0,col) )
archive_lines = []
   for row in range(1, sheet.nrows):
      elm = {}
      for col in range(sheet.ncols):
         elm[first_row[col]]=sheet.cell_value(row,col)
      archive_lines.append(elm)

【讨论】:

  • 添加一些解释这段代码的作用。
  • 此代码将整个 excel 文件作为字典读取
  • 你能写一个工作代码吗?这似乎很有趣。我想玩这个代码。我以前从未在 xlrd 上工作过。
  • 是的,我已经使用此代码将数据从 excel 文件导入 python 字典
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 2019-10-28
  • 2021-08-17
  • 2018-08-13
  • 2021-12-22
  • 2021-12-18
相关资源
最近更新 更多