如何在列中只放置部分字符串值?

2024-04-26 03:06:22 发布

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

我有以下数据帧:

import pandas as pd
import numpy as np
d={'P':['A[55]','B','C[98]"'],
   'Q':['C[89]','F[98]','K[97]'],
    'S':['B[89]',67,98],
   'id':['a','b','c']
  }
df=pd.DataFrame(data=d)

如何只在[]中放置选定列的数据,即“p”和“Q”。你知道吗

身份证应该这样留下。你知道吗

预期产量:

P      Q       S         id
55      89   89           a
np.nan  98    np.nan      b
98      97      np.nan    c

Tags: 数据importnumpyiddataframepandasdfdata
2条回答

如果先对数据进行堆栈,则可以通过一个str.extract操作处理所有列。你知道吗

df.loc[:,'P':'S'] = (
    df.loc[:,'P':'S'].astype(str).stack().str.extract(r'\[(\d+)\]').unstack()[0])
df

     P   Q    S id
0   55  89   89  a
1  NaN  98  NaN  b
2   98  97  NaN  c

细节
首先,将数据转换成字符串并叠加

df.loc[:,'P':'S'].astype(str).stack()

0  P     A[55]
   Q     C[89]
   S     B[89]
1  P         B
   Q     F[98]
   S        67
2  P    C[98]"
   Q     K[97]
   S        98
dtype: object

然后可以使用str.extract提取数字:

df.loc[:,'P':'S'].astype(str).stack().str.extract(r'\[(\d+)\]')

       0
0 P   55
  Q   89
  S   89
1 P  NaN
  Q   98
  S  NaN
2 P   98
  Q   97
  S  NaN 

然后,取消堆叠并重新分配。你知道吗

df.loc[:,'P':'S'].astype(str).stack().str.extract(r'\[(\d+)\]').unstack()[0]

     P   Q    S
0   55  89   89
1  NaN  98  NaN
2   98  97  NaN

使用extract获取数字,并将其他数字更改为NaN。如果列数较多,则可以迭代每列:

df.loc[:, 'P'] = df.loc[:, 'P'].str.extract('(\d+)')
df.loc[:, 'Q'] = df.loc[:, 'Q'].str.extract('(\d+)')
df.loc[:, 'S'] = df.loc[:, 'S'].str.extract('(\d+)')
df


+ -+  -+  +  -+  +
|   |  P  | Q  |  S  | id |
+ -+  -+  +  -+  +
| 0 | 55  | 89 | 89  | a  |
| 1 | NaN | 98 | NaN | b  |
| 2 | 98  | 97 | NaN | c  |
+ -+  -+  +  -+  +

相关问题 更多 >