1 数据导入
1.1 导入sql数据
import pandas as pd
from utils.mysql import db
### 获取数据库数据
# 查询数据库并导出
def sql2csv(path, sql):
res = db.getAll(sql)
df = pd.DataFrame(res)
print(res)
print(df)
df.to_csv(path)
return df
1.2 导入csv或Excel数据
import pandas as pd
df = pd.read_csv(path)
df = pd.read_excel(path)
2 数据清洗
- 以下操作基于pandas
import pandas as pd
2.1 查看数据类型
# 一般方法
print(type(a))
# 查看dataframe信息
print(df.info()) # Non-Null count: 每列数据的数据个数,缺失值 NaN 不作计算。
print(df.dtype)
print(df['uid'].dtype)
2.2 重复值处理
2.2.1 查重
df['uid'].unique() # 查看某一个列不重复的值
2.2.2 去重
df = df.drop_duplicates(['uid'],keep='fist')
# ['uid']代表去重的列
# keep可选first, last
2.3 缺失值处理
# 替换nan值
df = df.fillna(value='')
2.4 异常值处理
- 根据实际情况处理
- 采用统一处理函数apply
# 工具函数
def textNumber2int(init_number):
"""将带有文字的数字转为纯数字"""
init_number = str(init_number) # 先统一化成str
if init_number=='True':
return True
if init_number=='False':
return False
if len(init_number) == 0:
return -1
if '千' in init_number:
number = int(float(init_number[:-1]) * 1000)
elif '万' in init_number:
number = int(float(init_number[:-1])*10000)
elif '亿' in init_number:
number = int(float(init_number[:-1])*100000000)
elif '.' in init_number:
number = int(float(init_number))
else:
try:
number = int(init_number)
except:
print('init number', init_number)
return -1
return number
# 实际运用,实现将“32.2万”这种数据转为纯数值“322000”
df['fans_num'] = df['fans_num'].apply(lambda x: textNumber2int(x))
2.5 跨表查询
2.5.1 合并表格
- merge:两个Dataframe必须要有同一种属性可以作为键值,如下的id属性
import pandas as pd
df1 = pd.DataFrame({'id':['A', 'A', 'C', 'B', 'C']})
df2 = pd.DataFrame({'id':['A', 'B', 'C'], 'count':[1, 2, 3]})
df3 = pd.merge(df1, df2, how='left')
df3
>>> id count
0 A 1
1 A 1
2 C 3
3 B 2
4 C 3
- join:两个Dataframe没有重叠的属性,是通过index作为键值来合并
import pandas as pd
df1 = pd.DataFrame({'A':[22, 11, 33, 44]})
df2 = pd.DataFrame({'B':[13, 22, 44, 45], 'C':[1, 3, 2, 4]})
df = df1.join(df2, how='left')
>>> A B C
0 22 13 1
1 11 22 3
2 33 44 2
3 44 45 4
2.5.2 跨表查询
- 跨表查询
import pandas as pd
df1 = pd.DataFrame({'id':['A', 'A', 'C', 'B', 'C']})
df2 = pd.DataFrame({'id':['A', 'B', 'C'], 'count':[1, 2, 3]})
ids = df1['id']
print(df2[df2['id'].isin(ids)])
2.6 分组处理
2.6.1 按一列分组:df.groupby(column)
2.6.2 按多列分组:df.groupby([column1, column2])
2.6.3 查看每组的统计数据:df.groupby(column).describe()
2.6.4 组内离散列计数:df.groupby(column)[column2].value_counts()
数据表中的列按值是否连续,可以分为连续值列、离散值列。对于离散值列,可以统计其不重复值的个数。对于连续值列,统计不重复值一般没有意义。统计结果是一个Series对象。
2.6.5 组内数值列和:df.groupby(column).sum()
2.6.6 组内成员数:df.groupby(column).count()
2.6.7 组内数值列均值:df.groupby(column).mean()
2.6.8 组内数值列和:df.groupby(column).sum()
2.6.9 组内成员数:df.groupby(column).count()
2.6.10 组内数值列均值:df.groupby(column).mean()
- 所有列的均值
group = df.groupby(['gender'])
df1 = group.mean()
- 单列均值
group = df.groupby(['gender'])
df1 = group['math'].mean()
PS:后续的数组列计算均可分为所有列和单列的计算
2.6.11 组内数值列中位数:df.groupby(column).median()
2.6.12 组内数值列最大值:df.groupby(column).max()
2.6.13 组内数值列最小值:df.groupby(column).min()
2.6.14 组内数值列标准差:df.groupby(column).std()
2.6.15 组内数值列方差:df.groupby(column).var()
2.6.16 组内数值列二分位数:df.groupby(column).quantile()
2.6.17 组内数值列累计和:df.groupby(column).cumsum()
2.6.18 组内应用函数:df.groupby(column1)[column2].apply()
2.6.19 组内应用多个函数:df.groupby(column).agg([…])
2.6.20 组内不同列用不同函数:df.groupby(column).agg({column1:func, column2:func,…})
2.7 数值计算
- 选取对应行列直接计算即可
2.7.1 选取方法
loc
利用index的名称,来获取想要的行(或列)。(名称导向的这个特点,使得df[df.loc['col_name'] == 'condition', 'col_name'] = value_1
成立。iloc
利用index的具体位置(所以它只能是整数型参数),来获取想要的行(或列)。
# 注意:可以表示所有,也可以使用 2:4 选取2,3(左包括,右不包括)
df.iloc[:, 3] # 选择第4列整个列
df.iloc[2:4, 3] # 选择第4列的2,3行
2.7.2 计算示例
df2 = pd.DataFrame({'id':['A', 'B', 'C'], 'count1':[1, 2, 3], 'count2':[1, 2, 3]})
df2.iloc[:, 1] - df2.iloc[: ,2]
Out:
0 0
1 0
2 0
dtype: int64
2.8 改变数据类型
df = pd.DataFrame({'id':['A', 'B', 'C'], 'count1':[1, 2, 3], 'count2':[1, 2, 3]})
df['count1'] = df['count1'].astype('str')
2.9 查找值与替换值
- 按照loc或者iloc选择合适的列或行,然后赋值即可
df = pd.DataFrame({'id':['A', 'B', 'C'], 'count1':[1, 2, 3], 'count2':[1, 2, 3]})
df.iloc[df[df['id']=='A'].index, 0] = 'B' # 将id为A的全部改为B
# 1. df['id']=='A'代表查找值,返回的是True或False的series
# 2. 根据这个True或False的series选择df中对应的行
# 3. 修改选到的行id列的值
# 4. 将修改的结果赋值到原来的df的id列上,否则不会生效
2.10 导出数据
2.10.1 导出成csv数据
- 注意path路径要是csv文件,如 text.csv
df.to_csv(path, index=Fasle) # index=False代表去掉索引列,根据实际情况确定
2.10.1 导出成excel数据
- 注意path路径要是xlsx文件,如 text.xlsx
df.to_excel(path, index=Fasle) # index=False代表去掉索引列,根据实际情况确定