使用从Pandas DataFrame中的列中提取数字结构pd系列.extractall与。重新查找

2024-09-19 23:39:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我在熊猫df上有以下专栏:

| Primary_key |
|-------------|
| LIT1-1.10_t |
| LIT1-1.20_t |
| LIT1-1.30_t |
| LIT4-1.99_t | 
| LIT4-1.88_t |  
| LIT4-1.77_t | 

我希望从“Primary_key”(字符串)中提取版本号;将其拆分为版本号和ID,并将它们放入新的列中以获得以下输出:

^{pr2}$

我认为pandas.Series.str.extractall可以解决我的任务,但我有一些问题需要正确应用。我试过了 df['ID'] = df['Primary_Key'].str.extractall(r'(\d{3})').unstack().apply(','.join, 1)将所有数字提取到一个单独的列中('ID'),以便在下一步中将它们分开。但是用这个代码我只能得到最后三个数字:

| Primary_key  | ID |
|--------------|----|
| LIT1-1.10_t  |Nan |
| LIT1-1.20_t  |Nan |
| LIT1-1.30_t  |Nan |
| LIT4-1.999_t |999 |
| LIT4-1.888_t |888 |
| LIT4-1.777_t |777 |

希望你们中有一位经验丰富的程序员知道如何解决这个问题:)

PS:我也尝试过正则表达式re.findall('\d+',...),但我认为这不完全是蜜蜂的膝盖。在


Tags: key字符串idpandasdf版本号数字nan
2条回答

使用Regex:

演示:

import pandas as pd
df = pd.DataFrame({"Primary_key" : ["LIT1-1.10_t", "LIT1-1.20_t", "LIT4-1.77_t"]})
df["version_nr"] = df["Primary_key"].str.extract(r"\-(\d+)")
df["ID"] = df["Primary_key"].str.extract(r"\.(\d+)", )
print(df)

输出:

^{pr2}$

是的,str.extract和命名的捕获组应该可以做到这一点。在

v = df.Primary_key.str.extract(r'(?P<version_nr>\d+).(?P<ID>\d+)_', expand=True)

要更新df

^{pr2}$

df
   Primary_key version_nr  ID
0  LIT1-1.10_t          1  10
1  LIT1-1.20_t          1  20
2  LIT1-1.30_t          1  30
3  LIT4-1.99_t          1  99
4  LIT4-1.88_t          1  88
5  LIT4-1.77_t          1  77

相关问题 更多 >