首页 > 解决方案 > 从文本字符串中提取数字并将其移动到数据框中的单独列中

问题描述

我有一个作为一列导入的井数据的数据框,我拆分如下:

df = pd.read_csv(r'df.txt', header=None)
df.columns = ['Test']
df = df.Test.str.split(expand=True)

         0          1           2        3      4       5         6
0      well         1       20060201  3623.23  0.00   1300.00    None
1      well         1       20060202  3627.07  0.00   1305.00    None
2      well         1       20060203  3576.48  0.00   1305.00    None
...        ... ..       ...      ...   ...      ...   ...
42089  well14    20201114     0.00     0.00    0.00    None
42090  well14    20201115     0.00     0.00    0.00    None
...        ... ..       ...      ...   ...      ...   ...
51000  well         7       20201116   0.00    0.00    0.00      None
51001  well         7       20201117   0.00    0.00    0.00      None

如您所见,我的一些数据包含井名,其编号附在名称上。代码将其读取为一个实体并将其放入第 0 列。名称和编号之间有空格的井被分类到第 0 列和第 1 列。由于移位,添加了一个额外的列(第 6 列)。

我尝试使用 str.extract() 和 str.split() 将数字与井名分开并将其移动到第 1 列,这样我就可以使用 str.cat() 将第 0 列和第 1 列连接在一起,但是我无法让它工作。我需要它来处理不同的井名和编号。

最后,我需要我的数据看起来像这样:

          0          1           2       3      4                
0      well 1     20060201    3623.23  0.00   1300.00    
1      well 1     20060202    3627.07  0.00   1305.00   
2      well 1     20060203    3576.48  0.00   1305.00    
...        ... ..       ...      ...   ...      ...   
42089  well 14    20201114     0.00    0.00    0.00    
42090  well 14    20201115     0.00    0.00    0.00    
...        ... ..       ...      ...   ...      ...   
51000  well 7     20201116     0.00    0.00    0.00     
51001  well 7     20201117     0.00    0.00    0.00      

对此有任何帮助将不胜感激。谢谢!

标签: pythonpandasdataframesplitextract

解决方案


咱们试试吧:

# extract the names and digits
tmp = df[0].str.extract('^(.*\D)(\d+)?$')

# where the names are attached to digits
name_with_digits = tmp[1].notna()

# shift these values horizotally
df.loc[name_with_digits, 1:] = df.loc[name_with_digits, 1:].shift(axis=1)

# update the names
df.loc[name_with_digits,[0,1]] = tmp

# concatenate the names
df[0] = df[0] + ' ' + df[1].astype(str)

# drop unnecessary columns
df = df.drop([1,6], axis=1)

输出:

             0           2        3    4        5
0       well 1  20060201.0  3623.23  0.0  1300.00
1       well 1  20060202.0  3627.07  0.0  1305.00
2       well 1  20060203.0  3576.48  0.0  1305.00
42089  well 14    20201114      0.0  0.0      0.0
42090  well 14    20201115      0.0  0.0      0.0

推荐阅读