python - 如何将具有值为列表的列的数据框转换为数据框,其中该列中每个列表的每个元素都成为新行
问题描述
我有一个包含这种格式条目的数据框:
user_id,item_list
0,3569 6530 4416 5494 6404 6289 10227 5285 3601 3509 5553 14879 5951 4802 15104 5338 3604 2345 9048 8627
1,16148 8470 7671 8984 9795 6811 3851 3611 7662 5034 5301 6948 5840 345 14652 10729 8429 7295 4949 16144
...
*请注意,user_id 不是数据帧的索引
我想将数据框转换为如下所示的数据框:
user_id,item_id
0,3569
0,6530
0,4416
0,5494
...
1,4949
1,16144
...
现在我正在尝试这个,但它非常低效:
df = pd.read_csv("20recs.csv")
numberOfRows = 28107*20
df2 = pd.DataFrame(index=np.arange(0, numberOfRows),columns=('user', 'item'))
iter = 0
for index, row in df.iterrows():
user = row['user_id']
itemList = row['item_list']
items = itemList.split(' ')
for item in items:
df2.loc[iter] = [user]+[item]
iter = iter + 1
如您所见,我什至尝试为数据帧预分配内存,但似乎没有多大帮助。
所以必须有更好的方法来做到这一点。谁能帮我?
解决方案
用于split
将列表转换为实际列表,然后explode
……好吧,分解 DataFrame。需要熊猫 >= 0.25.0
>>> df = pd.DataFrame({'user_id': [0,1], 'item_list': ['1 2 3', '4 5 6']})
>>> df
user_id item_list
0 0 1 2 3
1 1 4 5 6
>>> (df.assign(item_id=df.item_list.apply(lambda x: x.split(' ')))
.explode('item_id')[['user_id', 'item_id']])
user_id item_id
0 0 1
0 0 2
0 0 3
1 1 4
1 1 5
1 1 6
推荐阅读
- javascript - 在 Javascript 中添加类时 CSS 转换不起作用
- python - 在 python 的 jupyter 笔记本中找不到文件?
- python - 如果我放大绘图,为什么 x 轴的时间会有所不同
- express - 可以将 Express 与 Material Design for Web 一起使用吗?
- python - Python Pandas 比较 DataFrame 单元格中的日期时间值
- azure - Azure Front Door 是否支持 TLS 客户端身份验证
- android - ActivityThread.handleDestroyActivity 中的“DecorView 未附加到窗口管理器”问题
- javascript - Vue-Multiselect - 取消选择一组预加载值不起作用
- vba - 在运行宏之前等待文档完全打开
- gremlin - 当 Gremlin 参数的名称包含空格时,有没有办法转义它?