将多个列表列对分解为 Pandas 中的更多行 [重复]
Posted
技术标签:
【中文标题】将多个列表列对分解为 Pandas 中的更多行 [重复]【英文标题】:Explode multiple list columns pairs to more rows in Pandas [duplicate] 【发布时间】:2021-10-30 13:15:56 【问题描述】:给定一个数据集如下:
id words tags
0 1 ['Φ', '20mm'] ['xc', 'PER']
1 2 ['Φ', '80mm'] ['xc', 'm']
2 3 ['EVA'] ['nz']
3 4 ['Q345'] ['nz']
df
dict 列表格式:
['id': 1, 'words': ['Φ', '20mm'], 'tags': ['xc', 'PER'],
'id': 2, 'words': ['Φ', '80mm'], 'tags': ['xc', 'm'],
'id': 3, 'words': ['EVA'], 'tags': ['nz'],
'id': 4, 'words': ['Q345'], 'tags': ['nz']]
来自words
的元素在tags
列中具有对应的词性标记(POS 标记)。
我希望将dataframe转换成以下格式:
id words tags
0 1 Φ xc
1 1 20mm PER
2 2 Φ xc
3 2 80mm m
4 3 EVA nz
5 4 Q345 nz
如何在 Pandas 中实现这一点?谢谢。
【问题讨论】:
如果您共享源代码会更容易:df.to_dict('records')
。同时尝试:explode:-> df.explode(['words', 'tags'])
@sammywemmy,这行不通,explode 只接受标量,它只能分解一列
请注意:在我的测试中,链接副本 (df.set_index(['id']).apply(pd.Series.explode).reset_index()
) 的接受答案比此处接受的答案快约 3 倍。
如果您使用的是 Pandas 1.3,explode 接受列列表/元组
您可以根据需要在索引中添加任意数量的列。 ['id', 'col1', 'col2']
等
【参考方案1】:
您可以考虑先用id
和words
分解数据帧,然后用id
和tags
分解数据帧,然后将它们连接起来。
import pandas as pd
df = pd.DataFrame(
"id":[1,2,3,4],
"words":[['Φ', '20mm'],['Φ', '80mm'], ['EVA'], ['Q345']],
"tags": [['xc', 'PER'], ['xc', 'm'], ['nz'], ['nz']])
a = df[["id", "words"]].explode("words")
b = df[["id", "tags"]].explode("tags")
pd.concat([a, b], axis=1)
【讨论】:
以上是关于将多个列表列对分解为 Pandas 中的更多行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在不丢失数据点顺序的情况下将 Pandas 中的字符串列表分解为单个列表
Pandas 将具有多个值的行数据合并到列的 Python 列表中
pandas将dataframe中的内容为列表(list)的数据列裂变拆分为多个新的数据列实战:拆分为多个新的数据列(并指定新数据列的名称)数据列中的列表(不等长)拆分为多个新的数据列产生NaN