re.match()在清理熊猫数据框中

时间:2020-08-30 12:10:11

标签: python pandas

我想使用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

1 个答案:

答案 0 :(得分:2)

您可以在此处将whereisin一起使用以进行完全匹配:

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

  • 您不需要使用正则表达式即可进行操作。您想匹配12,使用python列表和Pandas都有更直接的方法。当使用内置方法匹配某些东西时,变得很复杂,那么也许开始研究正则表达式。