我有一个如下所示的数据框。我试图仅从列表中所有列中提取数字值,无论它位于任何字符的右侧,左侧还是中间。如果列值没有数字值,则输入0而不是Nan
df = pd.DataFrame({
'A': ['1', 3, "1", "cad -2", 3, 4.876, np.nan],
'B': ['116', 'CAD -2.6399', 'CAD -3', '$-', '$5%', 'A', '-1.2 2']
})
df
我尝试了下面的代码,但是它为变量“ B”的第4行给出了NAN
l = ["A", "B"]
for columns in l:
if df[columns].dtype == 'object':
df[columns] = df[columns].astype('str').str.extract("([-+]?\d*\.\d+|[-+]?\d*\\d+)").astype(float)
df
我希望我的输出如下所示:
A B
1 116
3 -2.6399
1 -3
-2 0
3 5
4.876 0
NaN -1.2
答案 0 :(得分:0)
那这样的事情呢?
mask_nulls_data = df.isnull()
for column in df.columns:
if df[column].dtype == 'object':
df[column] = df[column].astype('str').str.extract("([-+]?\d*\.\d+|[-+]?\d*\\d+)").astype(float)
#Only put zeros where extract method filled by NaN
mask_nulls_string = df.isnull() & ~mask_nulls_data
df[mask_nulls_string] = 0