我有一个源系统给我这样的数据:
Name |Hobbies
----------------------------------
"Han" |"Art;Soccer;Writing"
"Leia" |"Art;Baking;Golf;Singing"
"Luke" |"Baking;Writing"
每个爱好列表都以分号分隔。我想把它变成一个类似表的结构,每个爱好都有一列,还有一个标志来指示一个人是否选择了那个爱好:
Name |Art |Baking |Golf |Singing |Soccer |Writing
--------------------------------------------------------------
"Han" |1 |0 |0 |0 |1 |1
"Leia" |1 |1 |1 |1 |0 |0
"Luke" |0 |1 |0 |0 |0 |1
这是在 pandas 数据框中生成示例数据的代码:
>>> import pandas as pd
>>> df = pd.DataFrame(
... [
... {'name': 'Han', 'hobbies': 'Art;Soccer;Writing'},
... {'name': 'Leia', 'hobbies': 'Art;Baking;Golf;Singing'},
... {'name': 'Luke', 'hobbies': 'Baking;Writing'},
... ]
... )
>>> df
hobbies name
0 Art;Soccer;Writing Han
1 Art;Baking;Golf;Singing Leia
2 Baking;Writing Luke
现在,我正在使用以下代码将数据放入具有我想要的结构的数据帧中,但它真的很慢(我的实际数据集大约有 150 万行) :
>>> df2 = pd.DataFrame(columns=['name', 'hobby'])
>>>
>>> for index, row in df.iterrows():
... for value in str(row['hobbies']).split(';'):
... d = {'name':row['name'], 'value':value}
... df2 = df2.append(d, ignore_index=True)
...
>>> df2 = df2.groupby('name')['value'].value_counts()
>>> df2 = df2.unstack(level=-1).fillna(0)
>>>
>>> df2
value Art Baking Golf Singing Soccer Writing
name
Han 1.0 0.0 0.0 0.0 1.0 1.0
Leia 1.0 1.0 1.0 1.0 0.0 0.0
Luke 0.0 1.0 0.0 0.0 0.0 1.0
有没有更有效的方法来做到这一点?
最佳答案
为什么不直接更改 DataFrame?
for idx, row in df.iterrows():
for hobby in row.hobbies.split(";"):
df.loc[idx, hobby] = True
df.fillna(False, inplace=True)
关于python - 将列表拆分为 pandas DataFrame 中的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47818314/