数据处理


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代表去掉索引列,根据实际情况确定

文章作者: fdChen
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fdChen !
评论
  目录
加载中...