我想从现有数据帧创建一个新数据帧,生成两个新列(“topic”和“num”),其中包含来自旧数据帧的“total”列的信息。
这是我想从中获取信息的旧数据框:
d = {'username': ['low_bu', 'kik', 'serg'],
'total': ['topic:tele,num:3,randomnums,topic:ordena,num:2','topic:pc,num:5,morenums,topic:ordena,num:3,things,topic:tele,num:4','topic:pc,num:2,sas,topic:ordena,num:3,rr,topic:other,num:4']
}
d = pd.DataFrame(d)
d
username total
0 low_bu topic:tele,num:3,randomnums,topic:ordena,num:2
1 kik topic:pc,num:5,morenums,topic:ordena,num:3,things,topic:tele,num:4
2 serg topic:pc,num:2,sas,topic:ordena,num:3,rr,topic:other,num:10
这是新数据框 (d_new) 的预期结果:
username topic num
low_bu tele 3
low_bu ordena 2
kik pc 5
kik ordena 3
kik tele 4
serg pc 2
serg ordena 3
serg other 10
我已经尝试过这种方法,但出现错误,无论如何我认为代码并不是我正在寻找的代码:
d_new = {}
d_new = pd.DataFrame(d_new)
d_new = d['username'].copy
d_new['topic'] = d.total.str.split('topic:').str[1].str.split(',').str[0]
d_new['num'] = d.total.str.split('num:').str[1].str.split(',').str[0]
您可以尝试使用正则表达式以您想要的方式提取它,如下例所示:
import pandas as pd
d = {'username': ['low_bu', 'kik', 'serg'],
'total': ['topic:tele,num:3,randomnums,topic:ordena,num:2','topic:pc,num:5,morenums,topic:ordena,num:3,things,topic:tele,num:4','topic:pc,num:2,sas,topic:ordena,num:3,rr,topic:other,num:4']
}
d = pd.DataFrame(d)
# extract topics from total column
topics = d.set_index('username').total.str.extractall(r'topic:([^,]*)')
# extract nums from total column
nums = d.set_index('username').total.str.extractall(r'num:([^,]*)')
# generate a new data in the multi array form
# [[username, topic, num], [username, topic, num]] ...
data = []
for username in d.username.unique():
for topic, num in zip(topics[0][username], nums[0][username]):
data.append([username, topic, num])
d_new = pd.DataFrame(data, columns='username,topic,num'.split(','))
print(d_new)
username topic num
0 low_bu tele 3
1 low_bu ordena 2
2 kik pc 5
3 kik ordena 3
4 kik tele 4
5 serg pc 2
6 serg ordena 3
7 serg other 4
在此处了解有关 Regex 的更多信息:https : //regexone.com
它对于提取文本非常有用。
这个网站对于测试你的正则表达式也非常有用:https : //regex101.com
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句