【问题标题】:Creating dictionary from excel data从excel数据创建字典
【发布时间】:2020-06-11 20:01:50
【问题描述】:

我在 excel 中有数据,需要为这些数据创建一个字典。

预期输出如下:-

d = [
{
"name":"dhdn",
"usn":1bm15mca13",
"sub":["c","java","python"],
"marks":[90,95,98]
},
{
"name":"subbu",
"usn":1bm15mca14",
"sub":["java","perl"],
"marks":[92,91]
},
{
"name":"paddu",
"usn":1bm15mca17",
"sub":["c#","java"],
"marks":[80,81]
}
]

尝试过的代码,但它只适用于两列

import pandas as pd
existing_excel_file = 'BHARTI_Model-4_Migration Service parameters - Input sheet_v1.0_DRAFT_26-02-2020.xls'

df_service = pd.read_excel(existing_excel_file, sheet_name='Sheet2')

df_service = df_service.fillna(method='ffill')
result = [{'name':k,'sub':g["sub"].tolist(),"marks":g["marks"].tolist()} for k,g in df_service.groupby(['name', 'usn'])]
print (result)

我正在变得像下面一样,但我想要像上面那样。

[{'name': ('dhdn', '1bm15mca13'), 'sub': ['c', 'java', 'python'], 'marks': [90, 95, 98]}, {'name': ('paddu', '1bm15mca17'), 'sub': ['c#', 'java'], 'marks': [80, 81]}, {'name': ('subbu', '1bm15mca14'), 'sub': ['java', 'perl'], 'marks': [92, 91]}]

【问题讨论】:

    标签: python-3.x pandas list dictionary


    【解决方案1】:

    最后,我解决了。

    import pandas as pd
    from pprint import pprint 
    existing_excel_file = 'BHARTI_Model-4_Migration Service parameters - Input sheet_v1.0_DRAFT_26-02-2020.xls'
    
    df_service = pd.read_excel(existing_excel_file, sheet_name='Sheet2')
    
    df_service = df_service.fillna(method='ffill')
    result = [{'name':k[0],'usn':k[1],'sub':v["sub"].tolist(),"marks":v["marks"].tolist()} for k,v in df_service.groupby(['name', 'usn'])]
    pprint (result)
    

    正如我所料,它给出了预期的输出。

    [{'marks': [90, 95, 98],
      'name': 'dhdn',
      'sub': ['c', 'java', 'python'],
      'usn': '1bm15mca13'},
     {'marks': [80, 81],
      'name': 'paddu',
      'sub': ['c#', 'java'],
      'usn': '1bm15mca17'},
     {'marks': [92, 91],
      'name': 'subbu',
      'sub': ['java', 'perl'],
      'usn': '1bm15mca14'}]
    

    【讨论】:

      【解决方案2】:

      好吧!我解决了你的问题,虽然我花了一段时间。

      第一部分与您的进度相同。

      import pandas as pd 
      
      df = pd.read_excel('test.xlsx')
      df = df.fillna(method='ffill')
      

      然后我们需要获取唯一名称以及它们覆盖的行数。我假设唯一的名称与唯一的“usn”一样多。我创建了一个存储这些“计数”的列表。

      unique_names = df.name.unique()
      unique_usn = df.usn.unique()
      counts = []
      for i in range(len(unique_names)):
          counts.append(df.name.str.count(unique_names[i]).sum())
      
      counts
      [3,2,2] #this means that 'dhdn' covers 3 rows, 'subbu' covers 2 rows, etc. 
      

      现在我们需要一个智能函数,它可以让我们从其他列中获取必要的信息。

      def get_items(column_number):
          empty_list = []
          lower_bound = 0
          for i in range(len(counts)): 
              empty_list.append(df.iloc[lower_bound:sum(counts[:i+1]),column_number].values.tolist())
              lower_bound = sum(counts[:i+1])
      
          return empty_list
      

      我留给您了解发生了什么。但基本上我们正在恢复必要的信息。我们现在只需要应用它来分别获取 subs 和 mark 的列表。

      list_sub = get_items(3)
      list_marks = get_items(2)
      

      最后,我们将它们全部放入一个 dicts 列表中。

      d = []
      
      for i in range(len(unique_names)):
          diction = {}
          diction['name'] = unique_names[i]
          diction['usn'] = unique_usn[i]
          diction['sub'] = list_sub[i]
          diction['marks'] = list_marks[i]
          d.append(diction)
      

      然后瞧!

      print(d)
      
      [{'name': 'dhdn', 'usn': '1bm15mca13', 'sub': [90, 95, 98], 'marks': ['c', 'java', 'python']}, 
      {'name': 'subbu', 'usn': '1bm15mca14', 'sub': [92, 91], 'marks': ['java', 'perl']}, 
      {'name': 'paddu', 'usn': '1bm15mca17', 'sub': [80, 81], 'marks': ['c#', 'java']}]
      

      【讨论】:

      • 非常感谢,@Enrique Ortiz Casillas。
      • 非常感谢您为我的问题所做的努力。
      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 2019-07-24
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2016-01-14
      • 2017-07-03
      相关资源
      最近更新 更多