数据分析---数据处理工具pandas(六)

数据分析—数据处理工具pandas(六)

十、分组转换及一般性“拆分-应用-合并”

1.数据分组转换,transform
df = pd.DataFrame({'data1':np.random.rand(5),
                  'data2':np.random.rand(5),
                  'key1':list('aabba'),
                  'key2':['one','two','one','two','one']})
print(df)

# 如果要将df分组后求其平均数,并添加到末尾,有以下两种方法 ---通过分组、合并,得到一个包含均值的Dataframe
# 1. 常规方法
df_mean = df.groupby('key1').mean()
print(df_mean)
print(pd.merge(df, df_mean, how='inner', left_on='key1', right_index=True))

# 2.用transform
a = df.groupby('key1').transform(np.mean).add_prefix('mean_')
print(a)
print(df.join(a, how='inner'))

# 结果:
      data1     data2 key1 key2
0  0.164857  0.086483    a  one
1  0.635920  0.812287    a  two
2  0.658663  0.578853    b  one
3  0.100171  0.112047    b  two
4  0.480083  0.492155    a  one
         data1     data2
key1                    
a     0.426953  0.463642
b     0.379417  0.345450
    data1_x   data2_x key1 key2   data1_y   data2_y
0  0.164857  0.086483    a  one  0.426953  0.463642
1  0.635920  0.812287    a  two  0.426953  0.463642
4  0.480083  0.492155    a  one  0.426953  0.463642
2  0.658663  0.578853    b  one  0.379417  0.345450
3  0.100171  0.112047    b  two  0.379417  0.345450
   mean_data1  mean_data2
0    0.426953    0.463642
1    0.426953    0.463642
2    0.379417    0.345450
3    0.379417    0.345450
4    0.426953    0.463642
      data1     data2 key1 key2  mean_data1  mean_data2
0  0.164857  0.086483    a  one    0.426953    0.463642
1  0.635920  0.812287    a  two    0.426953    0.463642
2  0.658663  0.578853    b  one    0.379417    0.345450
3  0.100171  0.112047    b  two    0.379417    0.345450
4  0.480083  0.492155    a  one    0.426953    0.463642
2.一般化Groupby方法:apply
用apply()方法可以调用自定义函数
df = pd.DataFrame({'data1':np.random.rand(5),
                  'data2':np.random.rand(5),
                  'key1':list('aabba'),
                  'key2':['one','two','one','two','one']})

print(df.groupby('key1').apply(lambda x: x.describe()))
# apply直接运行其中的函数
# 这里为匿名函数,直接描述分组后的统计量

def f_df1(d,n):   # d是DataFrame
    return(d.sort_index()[:n])
def f_df2(d,k1):  # d是DataFrame
    return(d[k1])
print(df.groupby('key1').apply(f_df1,2),'\n') # apply调用的函数,该函数的第一个参数必须是DataFrame
print(df.groupby('key1').apply(f_df2,'data2'))
print(type(df.groupby('key1').apply(f_df2,'data2')))
# f_df1函数:返回排序后的前n行数据
# f_df2函数:返回分组后表的k1列,结果为Series,层次化索引
# 直接运行f_df函数
# 参数直接写在后面,也可以为.apply(f_df,n = 2))

# 结果:
               data1     data2
key1                          
a    count  3.000000  3.000000
     mean   0.693046  0.608697
     std    0.257070  0.522231
     min    0.396401  0.011814
     25%    0.614231  0.422315
     50%    0.832060  0.832817
     75%    0.841368  0.907138
     max    0.850676  0.981459
b    count  2.000000  2.000000
     mean   0.352287  0.482039
     std    0.343271  0.675147
     min    0.109558  0.004638
     25%    0.230922  0.243339
     50%    0.352287  0.482039
     75%    0.473651  0.720740
     max    0.595016  0.959441
           data1     data2 key1 key2
key1                                
a    0  0.850676  0.832817    a  one
     1  0.396401  0.011814    a  two
b    2  0.109558  0.004638    b  one
     3  0.595016  0.959441    b  two 

key1   
a     0    0.832817
      1    0.011814
      4    0.981459
b     2    0.004638
      3    0.959441
Name: data2, dtype: float64
<class 'pandas.core.series.Series'>

举一个应用的例子:求一个DataFrame的每列缺失值数量

df = pd.DataFrame({
    'key1':np.arange(5),
    'key2':[2, 4, 6, np.nan, np.nan]
})

print(df)
print(df.apply(lambda x:np.sum(x.isnull())))

ar = np.array([True, False, True, True])
print(ar)
print(np.sum(ar))

# 结果:
   key1  key2
0     0   2.0
1     1   4.0
2     2   6.0
3     3   NaN
4     4   NaN
key1    0
key2    2
dtype: int64
[ True False  True  True]
3

十一、用pandas读取文件/数据库

1.read_table 与 read_csv

(1)read_table 与 read_csv读取方式即参数都差不多,下面介绍read_table方法

# 介绍几个常用的参数
pd.read_table(
    filepath_or_buffer, # 文件路径
    sep=False,          # 原数据集中各个字段(字段就是列标签)之间的分隔符
    delimiter=None,     # 原数据集中各个字段(字段就是列标签)之间的分隔符
    header='infer',     # 赋值行号,做为表头,默认为第一行做为表头
    names=None,         # 如果原数据没有字段,可以用该参数添加表头  ge:names=['key1', 'key2', 'key3']
    index_col=None,     # 将原数据集中的某些列作为行标签,也就是把选中的列做为行标签
    skiprows=None,      # 读取文件时,开头跳过多少行
    skipfooter=0,       # 读取文件时,末尾跳过多少行
    nrows=None,         # 读取指定的行的数据
    na_values=None,     # 指定原数据中哪些值作为缺失值
    skip_blank_lines=True, # 是否读取空行
    parse_dates=False,     # 如果参数为True,则尝试解析数据框(即DataFrame)中的行索引;
                           #  如果为列表,则解析对应的日期列;
                           # 如果参数为嵌套列表,则将某些列合并为日期列;
                           # 如果参数为字典,则解析对应的列(字典中的value),生成新的字段名(字典中的键)
    thousands=None,      # 指定原数据集中的千分位符号
    comment=None,        # 指定注释符,在读取数据时,如果碰到首行指定的注释符,则跳过该行
    encoding=None       # 指定字符编码
)

(2)应用:读取下列文件的信息
在这里插入图片描述

import pandas as pd
import numpy as np

df = pd.read_table(r'D:/小萌萌/a.txt', sep=',', skiprows=2, skipfooter=3, thousands='&', comment='#', parse_dates={'birthday':[0,1,2]})
print(df)

# 结果:
    birthday gender occupation  income
0 1990-03-07      男       销售经理    6000
1 1989-08-10      女        化妆师    8500
2 1992-10-07      女      前端设计师  18^000
2.read_excel 用来读.xlsx的excel

(1)read_excel()方法的主要参数介绍:

pd.read_excel(
    io,              # 文件路径
    sheet_name=0,    # 指定excel中的第几个sgeet,即可以传名称,也可以传下标
    header=0,        # 默认将第一行作为表头,不需要可以设置为None
    names=None,      # 自定义设置表头
    index_col=None,  # 将原数据集中的某些列作为行标签,也就是把选中的列做为行标签
    parse_cols=None,  # 
    skiprows=None,    # 读取文件时,开头跳过多少行
    skipfooter=0,     # 读取文件时,末尾跳过多少行
    nrows=None,       # 读取指定的行的数据
    na_values=None,    # 指定原数据中哪些值作为缺失值
    parse_dates=False, 
    thousands=None,    # 指定原数据集中的千分位符号
    comment=None,      # 指定注释符,在读取数据时,如果碰到首行指定的注释符,则跳过该行
    skip_footer=0,
    convert_float=True,  # 将所有的数值类型转为浮点型
    converters         # 通过字典的形式,指定某些列需要转换的形式
)

(2)应用:读取下面excel文件信息
在这里插入图片描述

df = pd.read_excel(r'D:/小萌萌/b.xlsx', header=None, names=['id', 'name', 'sex'], converters={0:str}, sheet_name=0)
print(df)

# 结果:
     id name sex
0  1023   张三   男
1  2250   李四   女
2  1135   王五   男
3.read_sql—用pandas读取mysql数据库

读取下面student数据库中stu表中的所有数据
在这里插入图片描述

import pymysql,pandas

connect = pymysql.connect(host='127.0.0.1', user='root', passwd='wanghao211', db='student')
sql = 'select * from stu;'
students = pd.read_sql(sql, connect)
print(students)

# 结果:
      SNO SName sex department
0  201711    张三   男      计算机学院
1  201714    李四   女     教育科学学院
2  201720    小王   男       化学学院

十二、将数据写入文件中

df = pd.DataFrame({
    'key1':np.arange(5),
    'key2':np.arange(10, 15)
})
print(df)
df.to_csv(r'D:\\a.csv', index=False, header=False) # 还可以 index='key2' header=['a', 'b'] 等等

# 结果:
   key1  key2
0     0    10
1     1    11
2     2    12
3     3    13
4     4    14

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElegantCodingWH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值