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

时间:2019-02-27 06:42:33

标签: python pandas

我有以下数据框:

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”)的数据。

ID应该这样保留。

预期输出:

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

2 个答案:

答案 0 :(得分:4)

如果先堆叠数据,则可以通过一次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

答案 1 :(得分:3)

使用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  |
+---+-----+----+-----+----+