从文本字符串中提取数字,并将其移动到数据帧中的单独列中



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

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.textract((和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      

如果有任何帮助,我将不胜感激。非常感谢。

让我们试试:

# 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

最新更新