Pandas数据框架-在所有列中将类似于None的值替换为None

mi7gmzs6  于 2022-11-20  发布在  其他
关注(0)|答案(4)|浏览(165)

我需要清理一个 Dataframe ,它的列来自不同的源,具有不同的类型。这意味着我可以有,例如,包含“nan”,“none”,“NULL”的字符串列,(作为字符串而不是None值)。
我的目标是找到所有的空值并将其替换为None。

for column in df.columns:
    for idx, row in df.iterrows():
        if (str(row[column]).lower() == "none") or if (str(row[column]).lower() == "nan") or (str(row[column]).lower() == "null"):
            df.at[row.name, column] = None

但这显然不是最好或最快的方法。我怎样才能利用Pandas运算或列表解析来做这个替换呢?谢谢!

umuewwlo

umuewwlo1#

如果您想使用numpy,也可以这样做(如果字段中的值确实是字符串)

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'name' : ['one', 'two', 'one', 'two'],
    'A' : ['null', 'none', 'empty', 'Keep']
})

df['A'] = np.where(df['A'].isin(['null', 'none', 'empty']), '', df['A'])
df
agxfikkp

agxfikkp2#

快速、轻松的优化:

for column in df.columns:
    for idx, row in df.iterrows():
        col = str(row[column]).lower()
        if (col == "none") or if (col == "nan") or (col == "null"):
            df.at[row.name, column] = None

不需要将row[column]转换为str,然后对每个字符迭代3次。
短代码:

its_none = ['none', 'nan', 'null']
for column in df.columns:
    for idx, row in df.iterrows():
        if str(row[column]).lower() in its_none:
            df.at[row.name, column] = None

甚至更短(我猜你期待的是一个数字)和更优化:

for column in df.columns:
    for idx, row in df.iterrows():
        if str(row[column]).lower().startswith('n'):
            df.at[row.name, column] = None
holgip5t

holgip5t3#

这似乎是一个有争议的主题(例如,参见本线程),但人们经常说列表解析比for循环在计算上更高效,尤其是在panda Dataframe 上迭代时。
我也更喜欢在风格上使用列表解析,因为它导致嵌套循环/if语句的缩进级别更少。
以下是您的使用案例的外观:

for column in df.columns:
    vals_list = df[column].to_list()
    replaced = [None if str(x).lower() in ['nan', 'none', 'null'] else x for x in vals_list]
    df[column] = replaced
v7pvogib

v7pvogib4#

简单方法,使用isinmask

df = pd.DataFrame([[1,2,'nan'],
                   ['none',3,'NULL']])

df_clean = df.mask(df.isin(["nan", "none", "NULL"]))

或者,如果要就地更新:

df[df.isin(["nan", "none", "NULL"])] = float('nan')

输出量:

0  1    2
0    1  2  NaN
1  NaN  3  NaN

相关问题