1. 读文件
1.1 读csv文件
# tsv文件与csv文件相似,分隔符是‘\t’
# 使用round() 确定数据保留几位小数
df = pd.read_csv('data.tsv', sep='\t').round(decimals=4)
# df = pd.read_csv(file_path, sep="\t", encoding='utf-8', error_bad_lines=False, keep_default_na=False)
# 读入时指定字段数据类型
df = pd.read_csv('test.csv', dtype={'a': int, 'b': float, 'c': D.Decimal, 'd': D.Decimal})
# df = pd.read_csv('test.csv', dtype=str) # 可避免长整形变成科学记数法
# engine默认是c,设置为python可避免编码错误问题
df = pd.read_csv('data.tsv', engine='python', header=None)
文件表头问题
# 若文件没有表头,可在读取时加上表头
df = pd.read_csv('tt.csv', names=['user_id', 'msg'])
# 若果使用下面的方式会丢失掉第一行(误把第一行作为旧表头)
df = pd.read_csv('tt.csv')
df.columns = ['user_id', 'msg']
# 若文件有表头
df = pd.read_csv('tt.csv', header=0, names=['user_id', 'msg'])
print(df.shape[0])
1.2 读excel文件
df = pd.read_excel('test.xlsx', sheet_name=excel_sheet_name)
1.3 读txt文件
df =pd.read_table('11.txt', sep='\t', header=None)
2. 元数据信息查看
# 查看前n条数据
print(df.head(n))
# 查看数据描述
print(df.describe())
# 查看字段类型
print(df.dtypes)
# 查看表头字段
print(df.columns)
# 将表头字段转化为数组
df.columns.tolist()
print('*' * 10, '数据总量:', df.shape[0], ' 特征数量:', df.shape[1])
3. 数据预处理
3.1 数据去空
data = df.dropna(how='all')
# data =df.dropna(axis=0, how='any', subset=['col1', 'col2'])
# 删除空值列
data = df.df(how='all', axis=1)
# 空值补0
data.fillna(0, inplace=True)
3.2 特殊值替换
df.replace({'good':0,'bad':1},inplace=True)
4. 数据打散与采样
4.1 数据打散
# shuffle
data = data.sample(frac=1, random_state=1024)
4.2 数据采样
data = data.sample(frac=0.8, random_state=1024)
data = data.sample(n=100, replace=False, random_state=None, axis=0)
按某一类别采样
# 假设fea_name有多个取值,现对fea_name=1的样本赋予一个[0-1]之间的随机值,显现采样
def fun1(fea_name):
score = 1 # 其余值赋值为1
if fea_name == 1:
score = round(random.uniform(0, 1.0), 2)
return score
def fun2(fea_name):
score = 1
if fea_name == 2:
score = round(random.uniform(0, 1.0), 2)
return score
data.insert(0, "prob1", data["fea_name"].map(lambda x: fun1(x)))
# 随机采样1-0.7=30%的样本
data = data.loc[data['prob1'] >= 0.7]
# 对fea_name=2,随机采样1-0.13=87%的样本
data.insert(0, "prob2", data["fea_name"].map(lambda x: fun2(x)))
data = data.loc[data['prob2'] >= 0.13]
5. 数据切分
# 将数据按照时间先后顺序分成5组
df = df.sort_values(by='dt', ascending=False)
df['rank'] = [i for i in range(df.shape[0])] # 增加排序索引
# 根据索引,切分为5组
df['rank'] = pd.cut(df['rank'], bins=5, labels=[i for i in range(5)])
# 查看分组后,每组的数据量
df['rank'].value_counts()