【问题标题】:List of lists to dictionary to pandas DataFrame从字典到熊猫 DataFrame 的列表列表
【发布时间】:2019-05-02 11:43:12
【问题描述】:

我正在尝试拟合这些数据:

[['Manufacturer: Hyundai',
  'Model: Tucson',
  'Mileage: 258000 km',
  'Registered: 07/2019'],
 ['Manufacturer: Mazda',
  'Model: 6',
  'Year: 2014',
  'Registered: 07/2019']]

到熊猫数据框。

并非所有标签都出现在每条记录中,例如,一些记录有“里程”,而另一些则没有,反之亦然。 我一共有 26 个功能,很少有项目具备所有这些功能。

我想构建将在列中保存特征的 pandas DataFrame,如果特征不存在,则内容应该是“NaN”。

我有

colnames=['Manufacturer', 'Model', 'Mileage', 'Registered', 'Year'...(all 26 features here)] 
df = pd.read_csv("./data/output.csv", sep=",", names=colnames, header=None)

很少有第一个先决条件列提供预期的输出,但是当涉及可选功能时,比缺失数据导致之后的功能出现在错误的列下。 仅当所有要素都存在时,记录才会正确映射。

我忘了提到一些缺失值的特征也没有“:”但存在于列表中。 所以在这两种情况下:

  • “里程”,(缺少值,但也缺少“:”)
  • 总记录中缺少“里程”

这两种情况的赋值都应该是“NaN”。

【问题讨论】:

    标签: python python-3.x pandas list dictionary


    【解决方案1】:

    对字典列表使用嵌套列表推导并传递给DataFrame构造函数,如果缺少相同的键则添加NaN

    L = [['Manufacturer: Hyundai',
      'Model: Tucson',
      'Mileage: 258000 km',
      'Registered: 07/2019'],
     ['Manufacturer: Mazda',
      'Model: 6',
      'Year: 2014',
      'Registered: 07/2019']]
    
    df = pd.DataFrame([dict(y.split(':') for y in x) for x in L])
    print (df)
      Manufacturer     Mileage    Model Registered   Year
    0      Hyundai   258000 km   Tucson    07/2019    NaN
    1        Mazda         NaN        6    07/2019   2014
    

    编辑:您可以使用 .split(maxsplit=1) 按第一个空格分割:

    L = [['Manufacturer Hyundai',
      'Model Tucson',
      'Mileage 258000 km',
      'Registered 07/2019'],
     ['Manufacturer Mazda',
      'Model 6',
      'Year 2014',
      'Registered 07/2019']]
    
    
    df = pd.DataFrame([dict(y.split(maxsplit=1) for y in x) for x in L])
    print (df)
    
      Manufacturer    Mileage   Model Registered  Year
    0      Hyundai  258000 km  Tucson    07/2019   NaN
    1        Mazda        NaN       6    07/2019  2014
    

    编辑:

    L = [['Manufacturer  Hyundai',
      'Model  Tucson',
      'Mileage  258000 km',
      'Registered  07/2019'],
     ['Manufacturer  Mazda',
      'Model  6',
      'Year  2014',
      'Registered  07/2019',
      'Additional equipment aaa']]
    
    words2 = ['Additional equipment']
    
    L1 = []
    for x in L:
        di = {}
        for y in x:
            for word in words2:
                if set(word.split(maxsplit=2)[:2]) < set(y.split()):
                    i, j, k = y.split(maxsplit=2)
                    di['_'.join([i, j])] = k
                else:
                    i, j = y.split(maxsplit=1)
                    di[i] = j
        L1.append(di)
    
    df = pd.DataFrame(L1)
    print (df)
      Additional_equipment Manufacturer    Mileage   Model Registered  Year
    0                  NaN      Hyundai  258000 km  Tucson    07/2019   NaN
    1                  aaa        Mazda        NaN       6    07/2019  2014
    

    【讨论】:

    • 它说:ValueError:字典更新序列元素#18的长度为1; 2 是必需的。这是第一条记录中的第一个空元素。
    • 我的错误。实际上,这些元素不仅仅是缺少,它们在功能名称后没有“:”。
    • 您的第一个版本可以完美地处理缺少功能的记录。我已经非常感谢了!不幸的是,更新版本不适用于特征有 2 个单词(“附加设备”)的记录,例如。
    • 太棒了!完美运行!非常感谢!
    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2020-07-22
    • 2021-12-01
    • 2021-04-30
    • 2018-05-09
    相关资源
    最近更新 更多