【问题标题】:Converting a csv to dict with multiple values将 csv 转换为具有多个值的 dict
【发布时间】:2022-01-02 08:03:32
【问题描述】:

我有一个 csv,加载时看起来像这样。

chicken, meat
veal, meat
rice, carbs
potato, carbs
carrot, veggies
mushroom, veggies
apples, fruits

我想从中创建一个字典,所以我正在使用代码:

food = pd.read_csv('foods.csv',  header=None, index_col=1, squeeze=False).to_dict()

当我打印字典时,每个键只显示一个项目。相反,我希望所有人都像这样展示。

{'carbs':['potato','rice'],
'meat':['chicken','veal'],
'veggies':['mushroom','carrot'],
'fruits':['apples']}

【问题讨论】:

  • 你有充分的理由在这里使用 pandas 吗?仅使用它来将 csv 转换为 dict 效率非常低
  • pd.read_csv('foods.csv', header=None).groupby([1])[0].agg(list).to_dict().

标签: python pandas csv dictionary


【解决方案1】:

你可以跳过 Pandas 直接处理文件。由于您实际上有两个字符分隔符', ',因此也更容易跳过 csv:

di={}
with open('/tmp/fruit.csv') as f:
    for x,y in (line.rstrip().split(', ') for line in f):
        di.setdefault(y, []).append(x)

>>> di
{'meat': ['chicken', 'veal'], 'carbs': ['rice', 'potato'], 'veggies': ['carrot', 'mushroom'], 'fruits': ['apples']}

或者使用熊猫:

df=pd.read_csv('/tmp/fruit.csv',  header=None, sep=', ', engine='python').groupby([1])[0].agg(list).to_dict()

>>> df
{'carbs': ['rice', 'potato'], 'fruits': ['apples'], 'meat': ['chicken', 'veal'], 'veggies': ['carrot', 'mushroom']}

【讨论】:

    【解决方案2】:

    如果您不需要 Pandas,可以使用 Python 的 CSV 阅读器轻松完成。

    import csv
    from collections import defaultdict
    
    
    category_food_map = defaultdict(list)
    
    with open('foods.csv', newline='') as f:
        reader = csv.reader(f)
    
        for row in reader:
            food, category = row
            category = category.strip()
    
            category_food_map[category].append(food)
    
    
    for category, food in category_food_map.items():
        print(f'{category}: {food}')
    

    我得到:

    meat: ['chicken', 'veal']
    carbs: ['rice', 'potato']
    veggies: ['carrot', 'mushroom']
    fruits: ['apples']
    

    【讨论】:

      【解决方案3】:

      有一个纯 python convtools 库,它提供了许多数据处理原语并促进了函数式方法:

      from convtools import conversion as c
      from convtools.contrib.tables import Table
      
      # store converter for future reuse
      converter = (
          c.group_by(c.item(1))
          .aggregate(
              {
                  # use c.ReduceFuncs.ArrayDistinct(c.item(0)) if you need only
                  # unique values in lists
                  c.item(1): c.ReduceFuncs.Array(c.item(0)),
              }
          )
          .gen_converter()
      )
      
      # stream reading and processing if needed
      rows = Table.from_csv(
          "tmp2.csv", dialect=Table.csv_dialect(skipinitialspace=True)
      ).into_iter_rows(list)
      result = converter(rows)
      
      assert result == [
          {'meat': ['chicken', 'veal']},
          {'carbs': ['rice', 'potato']},
          {'veggies': ['carrot', 'mushroom']},
          {'fruits': ['apples']}]
      

      【讨论】:

        猜你喜欢
        • 2014-04-06
        • 2017-05-18
        • 2021-06-01
        • 2021-12-05
        • 2020-02-09
        • 2020-09-08
        • 2019-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多