我有以下数据框:
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
答案 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 |
+---+-----+----+-----+----+