gie*_*eun 2 python string split dataframe pandas
我有这个暗网数据,数据如下所示:origin列包含一行中的多个国家/地区.
df = pd.DataFrame({'Item': ['Weapons', 'Drugs', 'Data'], 'Origin': ['US UK AUS', 'US', 'Canada']})
Run Code Online (Sandbox Code Playgroud)
我试图将第一行转换为多行.在这种情况下,三个!
df = pd.DataFrame({'Item': ['Weapons', 'Weapons', 'Weapons','Drugs', 'Data'], 'Origin': ['US', 'UK', 'AUS', 'US', 'Canada']})
Run Code Online (Sandbox Code Playgroud)
有没有我可以使用的简单代码?
如果不是这样,我怎么能使它成为可能?
选项1
str.extractall -
(df.set_index('Item').Origin
.str.extractall(r'\b(?P<Origin>\w+)\b')
.reset_index()
.drop('match', 1))
Item Origin
0 Weapons US
1 Weapons UK
2 Weapons AUS
3 Drugs US
4 Data Canada
Run Code Online (Sandbox Code Playgroud)
该模式将所有单词提取到一个单独的行中 -
\b # word boundary
(?P<Origin> # named capture group called "Origin"
\w+ # any string of letters/digits (you can change this to [^\s]+ instead to match punctuation
) # closing 1st capture group
\b # word boundary
Run Code Online (Sandbox Code Playgroud)
请注意,您可以通过移除drop呼叫并将其替换为呼叫来挤出更多性能del-
i = (df.set_index('Item').Origin
.str.extractall(r'\b(?P<Origin>\w+)\b')
.reset_index())
del i['match']
Run Code Online (Sandbox Code Playgroud)
选项2
str.split + stack-
(df.set_index('Item').Origin
.str.split(expand=True)
.stack()
.reset_index(level=0, name='Origin'))
Item Origin
0 Weapons US
1 Weapons UK
2 Weapons AUS
0 Drugs US
0 Data Canada
Run Code Online (Sandbox Code Playgroud)
性能
df = pd.concat([df] * 10000, ignore_index=True)
Run Code Online (Sandbox Code Playgroud)
%%timeit
(df.set_index('Item').Origin
.str.extractall(r'\b(?P<Origin>\w+)\b')
.reset_index()
.drop('match', 1))
1 loop, best of 3: 226 ms per loop
Run Code Online (Sandbox Code Playgroud)
%%timeit
(df.set_index('Item').Origin
.str.split(expand=True)
.stack()
.reset_index(level=0, name='Origin'))
10 loops, best of 3: 142 ms per loop
Run Code Online (Sandbox Code Playgroud)
请注意,实际数据的效果可能会因数据的性质等而有所不同.
| 归档时间: |
|
| 查看次数: |
447 次 |
| 最近记录: |