(化学结构)数据清洗流程

本文详细介绍了数据清洗的过程,包括观察和处理数据缺失、异常值、冗余以及格式不一致的问题。在化学信息学和QSAR建模研究中,数据清洗尤为重要,涉及无机物和混合物的筛选、带电荷分子和盐类的处理、化学结构规范化以及重复化合物的删除。文章还强调了人工检查在确保数据质量中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要参考 数据缺失、混乱、重复怎么办?最全数据清洗指南论化学结构整理在化学信息学和QSAR建模研究中的重要性 及一些实践

1.一般数据处理

1.1.观察数据

  • 查看数据集大小,数据类型等
# read the data
df = pd.read_csv('sberbank.csv')

# shape and data types of the data
print(df.shape)
print(df.dtypes)

# select numeric columns
df_numeric = df.select_dtypes(include=[np.number])
numeric_cols = df_numeric.columns.values
print(numeric_cols)

# select non numeric columns
df_non_numeric = df.select_dtypes(exclude=[np.number])
non_numeric_cols = df_non_numeric.columns.values
print(non_numeric_cols)

1.2.数据缺失

  • 可以用数据热图,缺失数据百分比,缺失数据直方图等观察
cols = df.columns[:30] # first 30 columns
colours = ['#000099', '#ffff00'] # specify the colours - yellow is missing. blue is not missing.
sns.heatmap(df[cols].isnull(), cmap=sns.color_palette(colours))



# if it's a larger dataset and the visualization takes too long can do this.
# % of missing.
for col in df.columns:
    pct_missing = np.mean(df[col].isnull())
    print('{} - {}%'.format(col, round(pct_missing*100)))



# first create missing indicator for features with missing data
for col in df.columns:
    missing = df[col].isnull()
    num_missing = np.sum(missing)
    if num_missing > 0:  
        print('created missing indicator for: {}'.format(col))
        df['{}_ismissing'.format(col)] = missing
# then based on the indicator, plot the histogram of missing values
ismissing_cols = [col for col in df.columns if 'ismissing' in col]
df['num_missing'] = df[ismissing_cols].sum(axis=1)
df['num_missing'].value_counts().reset_index().sort_values(by='index').plot.bar(x='index', y='num_missing')
  • 可以根据实际需求处理缺失数据,比如删除包含缺失值的行或列,填充某个量 或 特殊值
# drop rows with a lot of missing values.
ind_missing = df[df['num_missing'] > 35].index
df_less_missing_rows = df.drop(ind_missing, axis=0)



# hospital_beds_raion has a lot of missing.
# If we want to drop.
cols_to_drop = ['hospital_beds_raion']
df_less_hos_beds_raion = df.drop(cols_to_drop, axis=1)



# impute the missing values and create the missing value indicator variables for each numeric column.
df_numeric = df.select_dtypes(include=[np.number])
numeric_cols = df_numeric.columns.values
for col in numeric_cols:
    missing = df[col].isnull()
    num_missing = np.sum(missing)
    if num_missing > 0:  # only do the imputation for the columns that have missing values.
        print('imputing missing values for: {}'.format(col))
        df['{}_ismissing'.format(col)] = missing
        med = df[col].median()
        df[col] = df[col].fillna(med)

# impute the missing values and create the missing value indicator variables for each non-numeric column.
df_non_numeric = df.select_dtypes(exclude=[np.number])
non_numeric_cols = df_non_numeric.columns.values
for col in non_numeric_cols:
    missing = df[col].isnull()
    num_missing = np.sum(missing)
    if num_missing > 0:  # only do the imputation for the columns that have missing values.
        print('imputing missing values for: {}'.format(col))
        df['{}_ismissing'.format(col)] = missing
        top = df[col].describe()['top'] # impute with the most frequent value.
        df[col] = df[col].fillna(top)


# categorical
df['sub_area'] = df['sub_area'].fillna('_MISSING_')
# numeric
df['life_sq'] = df['life_sq'].fillna(-999)

1.3.异常值

# histogram of life_sq.
df['life_sq'].hist(bins=100)
# box plot.
df.boxplot(column=['life_sq'])
df['life_sq'].describe()

# bar chart -  distribution of a categorical variable
df['ecology'].value_counts().plot.bar()
  • 对异常值处理也可以丢弃,替换或保留

1.4.冗余

  • 不必要的冗余数据包括数据重复,数据不相关,数据复制。当完全确定这些数据提供不了任何信息的时候可以将其删除
num_rows = len(df.index)
low_information_cols = [] 

for col in df.columns:
    cnts = df[col].value_counts(dropna=False)
    top_pct = (cnts/num_rows).iloc[0]
    
    if top_pct > 0.95:  #所在列的95%的值都一样
        low_information_cols.append(col)
        print('{0}: {1:.5f}%'.format(col, top_pct*100))
        print(cnts)
        print()

df_dedupped = df.drop('id', axis=1).drop_duplicates()

1.5.格式不一致

  • 特征相同,但是字符串的大小写不一样;时间数据不统一;类别标签不统一;地址数据混乱等。需要根据实际情况考察

2.化学数据处理

2.1.无机物和混合物

  • 通过识别是否包含 C,H,O,N,S,Cl,Br,P 元素,删去包含其他元素的化合物,也可以根据具体情况过滤不需要的元素

  • 一个SMILES字符串可以代表多个分子,使其无法直接计算描述符。通常的做法是保留混合物中分子量最大或原子数最多的成分。然而,最好的选择是在计算描述符之前删除混合物的记录。

2.2.带电荷分子和盐类,处理显性/隐性氢原子

2.3.化学结构规范化

  • 官能团表示的规范化和同分异构体表示

2.4.重复化合物

  • 同一个化合物可能由不同的 SMILES 表示,需要删去完全一致的化合物

2.5.人工检查

  • 针对具体问题进行更细致的人工检查
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_森罗万象

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值