替换pandas框架中的问号

ruyhziif  于 2023-09-29  发布在  其他
关注(0)|答案(3)|浏览(108)

当从像csv文件这样的源阅读 Dataframe 时,像'?对于pandas中的空白值,将显示'。

如果这是一个数值列,你尝试用mean替换,比如df['weight'].replace('?',df['weight'].mean() ,inplace='True'),如果它的类型是“Object”而不是int64,可能不起作用。
在这种情况下,我取代这些'?因为isna()不直接作用于它们。然后将这些NaN替换为0,最后使用它们替换为要插补的实际值

df['SGOT'].replace('?',np.nan,inplace='True' )
df1['SGOT'].fillna(value=0,inplace=True)

df1['SGOT']=df1['SGOT'].astype(int)
df1['SGOT'].replace(0,df1['SGOT'].mean(),inplace=True )

我相信有更好的方法来做到这一点。请让我知道

zsbz8rwp

zsbz8rwp1#

当你读取数据时(大概是用pd.read_csv())是用nan替换'?'的好时机:

df = pd.read_csv(..., na_values='?')

参见docsna_values也可以是一个列表或指令集。
默认情况下,这将 * 添加 * '?'到要解释为NaN的字符串列表中(如果您愿意,可以使用keep_default_na=False进行更改)。

vhmi4jdf

vhmi4jdf2#

您可以发送一个dict作为参数到df.replace(),其中此dict将包括具有要替换的值和新值的列名。对于列的平均值,可以将参数errors指定为True。下面是一个代码来解释:

import pandas as pd
df = pd.DataFrame({'BILIRUBIN': [1, '?', 1, 0.4, 0.7], 
                   'SGOT':[18, '?','?',18, 18], 
                   'ALK_PHOSPHATE':[85, '?', '?', 45, 71]})

replace_dict = {'SGOT': {'?': pd.to_numeric(df.SGOT, errors='coerce').mean()}, 
                'BILIRUBIN':{'?': pd.to_numeric(df.BILIRUBIN, errors='coerce').mean()}, 
                'ALK_PHOSPHATE':{'?': pd.to_numeric(df.ALK_PHOSPHATE, errors='coerce').mean()}}

df.replace(replace_dict, inplace=True)

>>> df
   BILIRUBIN  SGOT  ALK_PHOSPHATE
0      1.000  18.0           85.0
1      0.775  18.0           67.0
2      1.000  18.0           67.0
3      0.400  18.0           45.0
4      0.700  18.0           71.0
kiz8lqtg

kiz8lqtg3#

这实际上取决于你的 Dataframe 。如果你的dataframe中有多种数据类型(比如string和integers),那么replace函数即使在使用inplace = True之后也不会工作。在这种情况下,您可以使用

# Replace "?" with np.nan in string columns
df = df.applymap(lambda x: np.nan if isinstance(x, str) and x.strip() == "?" else x)

# Replace "?" with np.nan in integer columns
df.replace("?", np.nan, inplace=True)

希望这对你有帮助。

相关问题