1.将dataframe中所有的np.nan转为None

df = df.where(df.notna(), None)

2.使用lambda及判断对dataframe中列按照条件改造

df['enb_name'] = df['enb_name'].apply(lambda x: x==x if x is None else (x.replace(',', '-') if x.find(',') else x==x))

将列中的包含的逗号都替换成-

3.替换dataframe列中的true,false等

df['tunable'] = df['tunable'].map({True: 1, False: 0, np.nan: 0})

4.将数据转为整型,但是读进来的数据不能保证没有小数,最保险的做法是四舍五入后转为整型,但是不能包含空值,需要先做一个转换

df['name'].fillna(-1, inplace=True)
df['name'] = df['name'].apply(lambda x: round(x))
df['name'].replace([-1], [None], inplace=True)

5.判断字符串是否为数字,有些数值列包含脏数据导致无法直接转换类型

def is_digit(s):
    """
    判断字符串是否是数值
    Args:
        s:

    Returns:

    """
    try:
        float(s)
        return True
    except ValueError:
        pass

    try:
        import unicodedata
        unicodedata.numeric(s)
        return True
    except (TypeError, ValueError):
        pass

    return False
lon = df['lon'].apply(lambda x: is_digit(x))
lat = df['lat'].apply(lambda x: is_digit(x))
df= df[lon & lat].copy()
df['lon'] = df['lon'].astype(float)
df['lat'] = df['lat'].astype(float)

6.对于很大的数据文件,采用分块读取处理保存的方式

df= pd.read_csv(local_path, chunksize=50000, encoding='utf-8')
    # 按块读取并存储
    for i, chuck in enumerate(df):
        # 分块处理
        valid_count, invalid_count, data_value =df_etl.data_process(chuck,result_data_type)

7.合并两个dataframe之前要保证合并的字段唯一,否则合并结果会多出很多

cell_param_temp = cell_param_temp.drop_duplicates(['cgi'])
cell_param_res = cell_param_res.drop_duplicates(['cgi'])
cell_param = pd.merge(cell_param_res, cell_param_temp, on='cgi', how="right")

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐