【问题标题】:How create a column with list of jsons if duplicated rows on other column?如果其他列上有重复的行,如何创建包含 json 列表的列?
【发布时间】:2022-12-15 14:11:32
【问题描述】:

我有一个看起来像这样的 Pandas 数据框:

buyer_id    car      color   year
john        ferrari  yellow  2022
eric        ferrari  red     2022
john        mercedes black   1990
victoria    audi     yellow  2017

我想创建一个新列(每行中的 json 列表。

创建一个“相同”列,每行都有一个列表:

  • 如果在“buyer_id”中只找到一个买家,则列表中的一个元素:

    [{'汽车':...,'颜色':...,'年份':...}]

  • 如果同一买家在“buyer_id”中的几行

    [ {'car':'ferrari', 'color': 'yellow', 'year': 2022}, {'car':'mercedes', 'color': 'black', 'year': 1990} ]

预期输出:

    buyer_id   car      color   year  identical
    john       ferrari  yellow  2022  [{'car':'ferrari', 'color': 'yellow ', 'year': 2022},{'car':'mercedes', 'color': 'black', 'year': 1990}]
    eric       ferrari  red     2022  [{'car':'ferrari', 'color': 'red', 'year': 2022}]
    john       mercedes black   1990  [[{'car':'ferrari', 'color': 'yellow ', 'year': 2022},{'car':'mercedes', 'color': 'black', 'year': 1990}]
    victoria   audi     yellow  2017  [{'car':'audi', 'color': 'yellow', 'year': 2017}]

我不知道如何用 Pandas 做到这一点,如果可能的话。

【问题讨论】:

  • 你想要字典还是 json 字符串作为输出?
  • 字典,json 列表

标签: python pandas


【解决方案1】:

您可以将 GroupBy.applyto_jsonorient="records" 参数一起使用:

s = (df.groupby('buyer_id')
       .apply(lambda g: g.drop('buyer_id', axis=1)
                         .to_json(orient='records'))
    )
df2 = df.merge(s.rename('identical'), left_on='buyer_id', right_index=True)

或就地:

s = (df.set_index('buyer_id')
       .groupby(level='buyer_id')
       .apply(lambda g: g.to_json(orient='records'))
    )
df['identical'] = df['buyer_id'].map(s)

输出:

   buyer_id       car   color  year                                                                                        identical
0      john   ferrari  yellow  2022  [{"car":"ferrari","color":"yellow","year":2022},{"car":"mercedes","color":"black","year":1990}]
1      eric   ferrari     red  2022                                                    [{"car":"ferrari","color":"red","year":2022}]
2      john  mercedes   black  1990  [{"car":"ferrari","color":"yellow","year":2022},{"car":"mercedes","color":"black","year":1990}]
3  victoria      audi  yellow  2017                                                    [{"car":"audi","color":"yellow","year":2017}]

【讨论】:

  • 谢谢 !有用
【解决方案2】:

尝试:

to_dict = lambda x: x.to_dict('records')
df['identical'] = df['buyer_id'].map(df.set_index('buyer_id') 
                                       .groupby('buyer_id').apply(to_dict))
print(df)

# Output
   buyer_id       car   color  year                                                                                                   identical
0      john   ferrari  yellow  2022  [{'car': 'ferrari', 'color': 'yellow', 'year': 2022}, {'car': 'mercedes', 'color': 'black', 'year': 1990}]
1      eric   ferrari     red  2022                                                          [{'car': 'ferrari', 'color': 'red', 'year': 2022}]
2      john  mercedes   black  1990  [{'car': 'ferrari', 'color': 'yellow', 'year': 2022}, {'car': 'mercedes', 'color': 'black', 'year': 1990}]
3  victoria      audi  yellow  2017                                                          [{'car': 'audi', 'color': 'yellow', 'year': 2017}]

要将您的列导出为 JSON,您可以使用:

>>> df['identical'].to_json(orient='records', indent=2)
[
  [
    {
      "car":"ferrari",
      "color":"yellow",
      "year":2022
    },
    {
      "car":"mercedes",
      "color":"black",
      "year":1990
    }
  ],
  [
    {
      "car":"ferrari",
      "color":"red",
      "year":2022
    }
  ],
  [
    {
      "car":"ferrari",
      "color":"yellow",
      "year":2022
    },
    {
      "car":"mercedes",
      "color":"black",
      "year":1990
    }
  ],
  [
    {
      "car":"audi",
      "color":"yellow",
      "year":2017
    }
  ]
]

【讨论】:

    【解决方案3】:
    def function1(dd:pd.DataFrame):
        return dd.assign(identical=dd.iloc[:,1:].to_json(orient="records"))
    
    df1.groupby('buyer_id').apply(function1)
    
     buyer_id   car      color   year  identical
        john       ferrari  yellow  2022  [{'car':'ferrari', 'color': 'yellow ', 'year': 2022},{'car':'mercedes', 'color': 'black', 'year': 1990}]
        eric       ferrari  red     2022  [{'car':'ferrari', 'color': 'red', 'year': 2022}]
        john       mercedes black   1990  [[{'car':'ferrari', 'color': 'yellow ', 'year': 2022},{'car':'mercedes', 'color': 'black', 'year': 1990}]
        victoria   audi     yellow  2017  [{'car':'audi', 'color': 'yellow', 'year': 2017}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 2022-10-13
      • 2022-01-12
      相关资源
      最近更新 更多