如果正则表达式条件在Pandas中匹配,如何添加np.nan

4jb9z9bj  于 2022-12-09  发布在  其他
关注(0)|答案(3)|浏览(120)

我有以下 Dataframe :

d_test = {
    'latitude' : [40.765004, 45.504641, 40.00000, -34.283007],
    'longitude' : [-73.965961, 122.000000, -90.121679, -118.439891],
    'test': [1,2,3,4],
}
df_test = pd.DataFrame(d_test)

我想使用正则表达式r'^[+-]?[0-9]*[.][0]*?$来放置np.nan,如果条件匹配。我知道如何使用正则表达式完全过滤结果:

df_test[~df_test[['latitude', 'longitude']].apply(lambda x: x.astype(str).str.contains(r'^[+-]?[0-9]*[.][0]*?$', regex=True)).any(axis=1)]

上面的代码给出:

latitude   longitude     test
0   40.765004   -73.965961     1
3   -34.283007  -118.439891    4

但我需要以下结果:

latitude   longitude    test
0   40.765004   -73.965961    1
1   NaN          NaN          2
2   NaN          NaN          3
3   -34.283007  -118.439891   4

我试着用Pandas的where

~df_[['latitude', 'longitude']].where(lambda x: x.astype(str).str.contains(r'^[+-]?[0-9]*[.][0]*?$', regex=True))

但它不工作(AttributeError: 'DataFrame' object has no attribute 'str'

vdzxcuhz

vdzxcuhz1#

您只需要将boolean indexingpandas.DataFrame.loc搭配使用:

m = df_test.apply(lambda x: x.astype(str).str.contains(r'^[+-]?[0-9]*[.][0]*?$', regex=True)).any(axis=1)
​
df_test.loc[m, ["latitude", "longitude"]] = np.NaN
#输出:
print(df_test)
    latitude   longitude  test
0  40.765004  -73.965961     1
1        NaN         NaN     2
2        NaN         NaN     3
3 -34.283007 -118.439891     4
7gcisfzg

7gcisfzg2#

您可以将其分配回列

df_test[['latitude', 'longitude']] = df_test[~df_test[['latitude', 'longitude']].apply(lambda x: x.astype(str).str.contains(r'^[+-]?[0-9]*[.][0]*?$', regex=True)).any(axis=1)]

输出量

latitude   longitude
0  40.765004  -73.965961
1        NaN         NaN
2        NaN         NaN
3 -34.283007 -118.439891
nfg76nw0

nfg76nw03#

把你的条件变成cond1

cond1 = ~df_test[['latitude', 'longitude']].apply(lambda x: x.astype(str).str.contains(r'^[+-]?[0-9]*[.][0]*?$', regex=True)).any(axis=1)

使用pandas where

df_test.where(cond1)

输出:

latitude   longitude
0  40.765004  -73.965961
1        NaN         NaN
2        NaN         NaN
3 -34.283007 -118.439891

相关问题