我想使用re.match()清理熊猫数据框,以便任何列中的条目为1或2时都保持不变,但是如果其他任何值都设置为NaN。
问题是我的函数将所有内容都设置为NaN。我是正则表达式的新手,所以我认为我做错了。
谢谢!
# DATA
data = [['Bob',10,1],['Bob',2,2],['Clarke',13,1]]
my_df = pd.DataFrame(data,columns=['Name','Age','Sex'])
print(my_df)
Name Age Sex
0 Bob 10 1
1 Bob 2 2
2 Clarke 13 1
# CLEANING FUNCTION
def my_fun(df):
for col in df.columns:
for row in df.index:
if re.match('^\d{1}(\.)\d{2}$', str(df[col][row])):
df[col][row] = df[col][row]
else:
df[col][row] = np.nan
return(df)
# OUTPUT
my_fun(my_df)
Name Age Sex
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
# EXPECTED/DESIRED OUTPUT
Name Age Sex
0 NaN NaN 1
1 NaN 2 2
2 NaN NaN 1
答案 0 :(得分:2)
my_df.where(my_df.isin([1,2]))
Name Age Sex
0 NaN NaN 1
1 NaN 2.0 2
2 NaN NaN 1
一些观察结果:
df[col][row]
不是在熊猫中为数据框建立索引的推荐方法。使用.loc
或.iloc
,请参阅Indexing and selecting data
此外,通常根本不建议在数据帧上循环,最终可能会导致性能很差的解决方案。我建议您阅读How to iterate over rows in a DataFrame in Pandas
您不需要使用正则表达式即可进行操作。您想匹配1
或2
,使用python列表和Pandas都有更直接的方法。当使用内置方法匹配某些东西时,变得很复杂,那么也许开始研究正则表达式。