python 数据处理踩过的坑
1.将dataframe中所有的np.nan转为Nonedf = 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(',') els
·
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")

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