0

我的熊猫数据框看起来像这样:

ID 地址
1 [{'city': 'MURFREESBORO', 'line': ['9999 Candy Cane Island'], 'postalCode': '39999', 'state': '56'}]
2 [{'city': 'LIKELAND', 'line': ['11111 WS 80RD ST'], 'postalCode': '71398', 'state': '99'}]
3 [{'city': 'CHASS', 'line': ['36 LONDON LN'], 'postalCode': '269235', 'state': '35'}]

如何将此列转换为多个列以使其看起来像这样?

ID 城市 线 邮政编码 状态
1 默弗里斯伯勒 9999 拐杖糖岛 39999 56
2 莱克兰 11111 WS 80RD ST 71398 99
3 查斯 36 伦敦 269235 35

我尝试了多种不同的方法:

df = pd.json_normalize(newdf['address'])

# AND
newdf['address'] = newdf['address'].apply(lambda x: "'" + str(x) + "'")
newdf['address'] = newdf['address'].apply(str).str.replace('[', '').str.replace(']', '')

构建 DataFrame 的数据:

{'id': [1, 2, 3],
 'address': [[{'city': 'MURFREESBORO', 'line': ['9999 Candy Cane Island'],
               'postalCode': '39999', 'state': '56'}],
             [{'city': 'LIKELAND', 'line': ['11111 WS 80RD ST'],
               'postalCode': '71398', 'state': '99'}],
             [{'city': 'CHASS','line': ['36 LONDON LN'],
               'postalCode': '269235', 'state': '35'}]]}
4

2 回答 2

2

您可以explode“寻址”列,将其转换为列表并用它构造一个 DataFrame;然后join它回到df

s = df['address'].explode()
out = df.join(pd.DataFrame(s.tolist(), index=s.index).explode('line')).drop(columns='address')

输出:

   id          city                    line postalCode state
0   1  MURFREESBORO  9999 Candy Cane Island      39999    56
1   2      LIKELAND        11111 WS 80RD ST      71398    99
2   3         CHASS            36 LONDON LN     269235    35
于 2022-02-17T19:20:54.157 回答
1

首先将地址列的每个元素中的1-元素列表更改为该元素的内容。

然后您可以对第 1 步的结果调用json_normalize并将结果保存在临时 DataFrame 中。

上述两个操作都可以执行为:

wrk = pd.json_normalize(df.address.str[0])

还有一个转换要执行,即将line列的每个元素中的 1-element list 更改为该元素的内容:

wrk.line = wrk.line.str[0]

最后一步是将id列与wrk加入:

result = df[['id']].join(wrk)

结果是:

   id          city                    line postalCode state
0   1  MURFREESBORO  9999 Candy Cane Island      39999    56
1   2      LIKELAND        11111 WS 80RD ST      71398    99
2   3         CHASS            36 LONDON LN     269235    35

最左边的列是索引,您没有在帖子中包含它。

为了更容易理解上面的代码是如何工作的,在我的代码的每一步之后打印wrk 。

于 2022-02-17T19:54:18.527 回答