【问题标题】:Loading a dataframe with multiple fields with the same name加载具有多个同名字段的数据框
【发布时间】:2019-05-25 23:26:49
【问题描述】:

我有以下数据,来自一个 excel 文件:

L = [{'id': [1,2,3]},
     {'name': [4,3,2]},
     {'id': [9,0,1]}]

如何将其加载到数据框中,以便我的结果如下所示:

   id  name  id
0   9     4  1
1   0     3  2
2   1     2  3 

做类似的事情:

df = pd.DataFrame(OrderedDict([(k, v) for d in L for k, v in d.items()]))

由于 dicts 不支持重复键名,因此删除其中一列。

【问题讨论】:

  • 你不能有重复的列名。
  • @W-B 现在注意重复的列名。
  • @W-B 哦,我明白了——感谢您指出这一点:我昨天没有看到那个答案。

标签: python pandas


【解决方案1】:
In [531]: df = pd.concat(map(pd.DataFrame, L), axis=1); df
Out[531]: 
   id  name  id
0   1     4   9
1   2     3   0
2   3     2   1

您可能还想考虑消除列的歧义:

In [551]: df.columns = pd.MultiIndex.from_arrays([df.columns, df.columns.to_series().groupby(df.columns).cumcount().astype(str)]).map('_'.join)

In [552]: df
Out[552]: 
   id_0  name_0  id_1
0     1       4     9
1     2       3     0
2     3       2     1

【讨论】:

    【解决方案2】:

    您可以连接 Pandas 系列对象的可迭代对象:

    df = pd.concat((pd.Series(v, name=k) for d in L for k, v in d.items()), axis=1)
    
    print(df)
    
       id  name  id
    0   1     4   9
    1   2     3   0
    2   3     2   1
    

    这应该比连接数据帧便宜:

    L *= 10**3
    
    %timeit pd.concat((pd.Series(v, name=k) for d in L for k, v in d.items()), axis=1)  # 480 ms
    %timeit pd.concat(map(pd.DataFrame, L), axis=1)                                     # 1.25 s
    

    要重命名列以区分重复的列标签,您可以使用上一个问题中的this renaming recipe

    from collections import defaultdict
    
    def rename_duplicates(original_cols):
        count = defaultdict(int)
        for x in original_cols:
            yield f'{x}_{count[x]}'
            count[x] += 1
    
    df.columns = rename_duplicates(df.columns)
    
    print(df)
    
       id_0  name_0  id_1
    0     1       4     9
    1     2       3     0
    2     3       2     1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 2011-03-27
      • 2012-11-26
      • 2018-03-21
      相关资源
      最近更新 更多