代码之家  ›  专栏  ›  技术社区  ›  ababuji

字典键,在pandas中,单元格到名称为键、行为值的列的值对

  •  1
  • ababuji  · 技术社区  · 7 年前

    我发现很难用正确的词来界定这个问题。但我希望我做得很好…

    下面是一个我人工创建的示例,您可以在控制台中复制它。

    example = pd.DataFrame([['a', [{'a1': 1,
            'a2': {'amount': 20, 'currency': 'USD'}, 'a3': 57},
           {'a1': 4,
            'a2': {'amount': 50, 'currency': 'USD'}},
           {'a1': 7,
            'a2': {'amount': 80, 'currency': 'USD'}}], 10, 11], 
    
                            ['b', [{'a1': 13,
            'a2': {'amount': 140, 'currency': 'USD'}},
           {'a1': 2,
            'a2': {'amount': 50, 'currency': 'USD'}},
           {'a1': 3,
            'a2': {'amount': 90, 'currency': 'USD'}}], 16, 17], 
    
                            ['c', [{'a1': 8,
            'a2': {'amount': 75, 'currency': 'USD'}},
           {'a1': 9,
            'a2': {'amount': 90, 'currency': 'USD'}, 'a3': 98},
           {'a1': 6,
            'a2': {'amount': 10, 'currency': 'USD'}}], 11, 12]])
    
    example.columns = ['column1', 'column2', 'column3', 'column4']
    print(example)
    

    数据帧 example 的第二列是嵌套类字典结构的列表。

    print(example.loc[[0], ["column2"]].values.tolist())
    
    [[[{'a1': 1, 'a2': {'amount': 20, 'currency': 'USD'}, 'a3': 57},
       {'a1': 4, 'a2': {'amount': 50, 'currency': 'USD'}},
       {'a1': 7, 'a2': {'amount': 80, 'currency': 'USD'}}]]]
    

    这是Row 0 ,列命名 column2 我用 loc .

    这个 print(exampleSolution) 语句应该会给您我正在寻找的pandas数据帧。

    exampleSolution = pd.DataFrame([['a', 1, 20, 'USD', 57, 10, 11], ['a', 4, 50, 'USD', None, 10, 11], 
                                    ['a', 7, 80, 'USD', None, 10, 11], ['b', 13, 140, 'USD', None, 16, 17], 
                                    ['b', 2, 50, 'USD', None, 16, 17], ['b', 3, 90, 'USD', None, 16, 17], 
                                    ['c', 8, 75, 'USD', None, 11, 12], ['c', 9, 90, 'USD', 98, 11, 12], 
                                    ['c', 6, 10, 'USD', None, 11, 12]])
    
    exampleSolution.columns = ['column1', 'a1', 'amount', 'currency', 'a3', 'column3', 'column4']
    print(exampleSolution)
    

    基本上,我想把字典放在里面 第2栏 要为每一行解包,我希望dictionary键是一个附加列名,行中的值是与该键对应的dictionary值。如果有某些键,其他行的值对(在我的示例中,我们看到第一行 我用过的 洛克 用这把钥匙打印出来 a3 而同一排 没有 A3 在它的嵌套字典的第二和第三项中!同样,这一排 2 还有一把钥匙 A3 在其嵌套字典的第二项中。类似地 如果嵌套字典中可能有一个从未在其他行中出现过的特定键、值对,那么我希望解决方案对情况是健壮的! 可能有一个 a4 在的嵌套字典中 第2栏 对于特定的行,以及 a5 对于另一行,我希望这些额外的列存在于结果数据帧中,而不管 None 或一个 NaN !另外,您可能已经看到的第二列现在有一个键 a2 ,其中有一个嵌套(键、值)对,我希望它作为单独的列 amount , currency 键,值对。

        column1  a1  amount currency    a3  column3  column4
    0       a    1      20      USD  57.0       10       11
    1       a    4      50      USD   NaN       10       11
    2       a    7      80      USD   NaN       10       11
    3       b   13     140      USD   NaN       16       17
    4       b    2      50      USD   NaN       16       17
    5       b    3      90      USD   NaN       16       17
    6       c    8      75      USD   NaN       11       12
    7       c    9      90      USD  98.0       11       12
    8       c    6      10      USD   NaN       11       12
    

    到目前为止我做了什么?

    我羞于说我不知道从哪里开始…

    上面的例子是我从json文件(300mb)派生的pandas数据帧的一个小得多的版本。最初,我不必要地花费大量时间创建嵌套字典结构,然后解压缩卷绕的嵌套字典,结果发现从json创建数据帧的命令是 pd.read_json()

    1 回复  |  直到 7 年前
        1
  •  0
  •   ababuji    7 年前
    from pandas.io.json import json_normalize    
    
    rows = list(example.index)    
    
    mainDf = pd.DataFrame()
    for index in rows:
        listing = example.at[index, "column2"]
    
        df = pd.DataFrame()    
    
    
        for i in listing:
    
    
            l = (json_normalize(i))
    
            df = df.append(l)
    
        otherCols = list(example.columns)
        otherCols.remove('column2')
    
        for col in otherCols:
            #print(example.loc[[index], [col]])
    
            df[col] = example.at[index, col]
    
        mainDf = mainDf.append(df)
    
    
    print(mainDF)