Python数据处理DataFrame小记

简介:

目前从事数据版块的工作,基本就是数仓、ETL、BI这一块。学习了一个python机器学习课程,在此记下学习过程中遇到的坑。pandas的详细使用可查:http://pandas.pydata.org/pandas-docs/stable/index.html

1、DataFram定义:

只定义列名

import pandas as pd

df = pd.DataFrame(columns=['姓名','年龄','性别'])
print(df)

输出为:
Empty DataFrame
Columns: [姓名, 年龄, 性别]
Index: []

列名及索引(行名)都定义:

import pandas as pd

df = pd.DataFrame(columns=['姓名','年龄','性别'],index=['甲','乙','丙'])
print(df)

输出为:
  姓名 年龄 性别
甲 NaN NaN NaN
乙 NaN NaN NaN
丙 NaN NaN NaN

定义加上值:

import pandas as pd

df = pd.DataFrame([['张三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年龄','性别'],index=['甲','乙','丙'])
print(df)

输出为:
  姓名 年龄 性别
甲 张三 23 男
乙 李四 24 女
丙 王五 35 男

2、DataFrame的append

append字典结构

import pandas as pd

df = pd.DataFrame(columns=['姓名','年龄','性别'])
print(df)
line = {'姓名':'张三','年龄':24,'性别':'男'}
df = df.append(line,ignore_index=True)
print(df)

输出为:
Empty DataFrame
Columns: [姓名, 年龄, 性别]
Index: []
  姓名 年龄 性别
0 张三 24 男

append Series结构
方法1:

import pandas as pd

df = pd.DataFrame(columns=['姓名','年龄','性别'])
print(df)
line = pd.Series({'姓名':'张三','年龄':24,'性别':'男'})
df = df.append(line,ignore_index=True)
print(df)

输出为:
Empty DataFrame
Columns: [姓名, 年龄, 性别]
Index: []
 姓名 年龄 性别
0 张三 24 男

方法2:

import pandas as pd

df = pd.DataFrame(columns=['姓名','年龄','性别'])
print(df)
line = pd.Series({'姓名':'张三','年龄':24,'性别':'男'},name='Series可以设置索引名称')
df = df.append(line,ignore_index=False)
print(df)

输出为:
Empty DataFrame
Columns: [姓名, 年龄, 性别]
Index: []
            姓名 年龄 性别
Series可以设置索引名称 张三 24 男

如果是append字典,则ignore_index必须为True,如果是append Series结构,则可以设置ignore_index为False,然后设置特定的索引。

3、DataFrame去除列或行

去除列:

import pandas as pd

df = pd.DataFrame([['张三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年龄','性别'],index=['甲','乙','丙'])
print(df)
#inplace如果设置为False,则不会替换原有对象
df.drop(columns=['姓名','年龄'],inplace=False)
print(df)
#列删除
df.drop(columns=['姓名','年龄'],inplace=True)
print(df)
#行删除
df = pd.DataFrame([['张三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年龄','性别'],index=['甲','乙','丙'])
df.drop(index='甲',inplace=True)
print(df)

输出为:
 姓名 年龄 性别
甲 张三 23 男
乙 李四 24 女
丙 王五 35 男
 姓名 年龄 性别
甲 张三 23 男
乙 李四 24 女
丙 王五 35 男
  性别
甲 男
乙 女
丙 男
  姓名 年龄 性别
乙 李四 24 女
丙 王五 35 男

drop方法,需要留意inplace变量,若要替换则设置为True,columns和index可以通过列表结构或字符串来定位需要删除的列和行。

行删除的方法二:

import pandas as pd

df = pd.DataFrame([['张三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年龄','性别'],index=['甲','乙','丙'])
print(df)
#isin是获取所有姓名为['张三']的行数据,~是取反的意思。
df = df[~df['姓名'].isin(['张三'])]
print(df)

输出为:
  姓名 年龄 性别
甲 张三 23 男
乙 李四 24 女
丙 王五 35 男
  姓名 年龄 性别
乙 李四 24 女
丙 王五 35 男

4、DataFrame查看数据基本统计情况

查看统计详情:

import pandas as pd

df = pd.DataFrame([['张三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年龄','性别'],index=['甲','乙','丙'])
print(df)
print(df.describe())

输出为:
  姓名 年龄 性别
甲 张三 23 男
乙 李四 24 女
丙 王五 35 男
   年龄
count 3.000000
mean 27.333333
std 6.658328
min 23.000000
25% 23.500000
50% 24.000000
75% 29.500000
max 35.000000

describe方法可以看到数据里面数值类型的基本统计情况。

5、DataFrame的applymap及apply操作

applymap操作:

import pandas as pd

df = pd.DataFrame([4,13,5,38,28,59,24,79],columns=['年龄'])

def testApplyMap(age):
    #小于30的标记为年轻,大于等于30的标记为中年,大于等于60标记为老年
    return '老年' if age >= 60 else ('中年' if age >= 30 else '年轻')
print(df)
print(df.applymap(testApplyMap))
print(df)
df = df.applymap(testApplyMap)
print(df)

输出为:
 年龄
0 4
1 13
2 5
3 38
4 28
5 59
6 24
7 79
  年龄
0 年轻
1 年轻
2 年轻
3 中年
4 年轻
5 中年
6 年轻
7 老年
 年龄
0 4
1 13
2 5
3 38
4 28
5 59
6 24
7 79
 年龄
0 年轻
1 年轻
2 年轻
3 中年
4 年轻
5 中年
6 年轻
7 老年

applymap是向方法中传入每一个元素,然后方法返回结果。applymap没有inplace参数,如果要覆盖原对象,需要进行重新赋值操作。

apply操作:

import pandas as pd

df = pd.DataFrame({

    's1': [27.93, 58.08, 38.67, 45.83, 70.26, 46.61, 49.73, 34.02, 56.64, 57.28],

    's2': [28.18, 50.61, 31.73, 31.48, 55.96, 22.73, 40.47, 42.02, 31.39, 64.21],

    's3': [29.39, 51.62, 57.91, 45.94, 53.81, 45.77, 69.13, 28.75, 43.43, 55.7],

    's4': [40.52, 48.55, 59.24, 71.21, 58.48, 63.63, 55.16, 34.9, 54, 68.03],

    's5': [26.26, 54.03, 49.08, 46.53, 43.23, 56.79, 58.71, 26.43, 44.97, 54.16]

}, index =  ['05-21', '05-22', '05-23', '05-24', '05-25', '05-26', '05-27', '05-28', '05-29', '05-30'])

def testApply(sale):
    return max(sale)
print(df)
print(df.apply(testApply))
print(df.apply(testApply,axis=1))
print(df)

输出为:
   s1 s2 s3 s4 s5
05-21 27.93 28.18 29.39 40.52 26.26
05-22 58.08 50.61 51.62 48.55 54.03
05-23 38.67 31.73 57.91 59.24 49.08
05-24 45.83 31.48 45.94 71.21 46.53
05-25 70.26 55.96 53.81 58.48 43.23
05-26 46.61 22.73 45.77 63.63 56.79
05-27 49.73 40.47 69.13 55.16 58.71
05-28 34.02 42.02 28.75 34.90 26.43
05-29 56.64 31.39 43.43 54.00 44.97
05-30 57.28 64.21 55.70 68.03 54.16
s1 70.26
s2 64.21
s3 69.13
s4 71.21
s5 58.71
dtype: float64

05-21 40.52
05-22 58.08
05-23 59.24
05-24 71.21
05-25 70.26
05-26 63.63
05-27 69.13
05-28 42.02
05-29 56.64
05-30 68.03
dtype: float64
    s1 s2 s3 s4 s5
05-21 27.93 28.18 29.39 40.52 26.26
05-22 58.08 50.61 51.62 48.55 54.03
05-23 38.67 31.73 57.91 59.24 49.08
05-24 45.83 31.48 45.94 71.21 46.53
05-25 70.26 55.96 53.81 58.48 43.23
05-26 46.61 22.73 45.77 63.63 56.79
05-27 49.73 40.47 69.13 55.16 58.71
05-28 34.02 42.02 28.75 34.90 26.43
05-29 56.64 31.39 43.43 54.00 44.97
05-30 57.28 64.21 55.70 68.03 54.16

apply是想方法里面传入一列或者一行进行运算,axis=0是传入一列,axis=1则传入一行,默认为0。

6、DataFrame的元素、列、行的获取

import pandas as pd

df = pd.DataFrame([['张三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年龄','性别'],index=['甲','乙','丙'])

print(df,'\n')
print('DataFrame后面紧接[],则可以获取对应列数据')
print(df['姓名'],'\n')
print('DataFrame后面紧接[][],第一个为列名,第二个为行名')
print(df['姓名']['甲'],'\n')
print('DataFrame的iloc里面对应的是行的默认索引,0代表第一行,1代表第二行,如此类推')
print(df.iloc[0],'\n')
print('DataFrame的loc里面对应的行名')
print(df.loc['甲'],'\n')
print('获取列后,也是可以通过iloc和loc来获取行数据的')
print(df['姓名'].iloc[2])
print(df['姓名'].loc['丙'],'\n')
print('iat可以通过列和行的默认索引来定位数据')
print(df.iat[0,0],'\n')

输出为:
姓名 年龄 性别
甲 张三 23 男
乙 李四 24 女
丙 王五 35 男

DataFrame后面紧接[],则可以获取对应列数据
甲 张三
乙 李四
丙 王五
Name: 姓名, dtype: object

DataFrame后面紧接[][],第一个为列名,第二个为行名
张三

DataFrame的iloc里面对应的是行的默认索引,0代表第一行,1代表第二行,如此类推
姓名 张三
年龄 23
性别 男
Name: 甲, dtype: object

DataFrame的loc里面对应的行名
姓名 张三
年龄 23
性别 男
Name: 甲, dtype: object

获取列后,也是可以通过iloc和loc来获取行数据的
王五
王五

iat可以通过列和行的默认索引来定位数据
张三

7、DataFrame的透视表

方法为pivot_table:

import pandas as pd
import numpy as np


df = pd.DataFrame([ ['张三','语文',98.],

                   ['张三','体育',60.],

                   ['李四','数学',60.],

                   ['李四','语文',100.],

                   ['王五','数学',89],

                   ['王五','体育',98.] ],

                    columns=['name','course','score'])

print(df.pivot_table('score',index='name',columns='course',aggfunc=np.sum,margins=True,fill_value=0))

输出为:
course 体育 数学 语文 All
name
张三 60 0 98 158.0
李四 0 60 100 160.0
王五 98 89 0 187.0
All 158 149 198 505.0

参数说明:
data: 创建透视表的dataframe

values: 要聚合的值, optional

index: 要聚合的index

columns: 要聚合的columns

aggfunc:聚合的方式, default numpy.mean

fill_value: 用来替换透视表的缺失值scalar, default None

margins: 添加所有行,列,例如在后面加个“总和”boolean, default False

dropna: 不要包含条目都是NaN的列boolean, default True

margins_name: 行列名称, default ‘All’

8、DataFrame空值处理、去重

空值处理:

import pandas as pd


df = pd.DataFrame([23,3,13,None,5],columns=['年龄'])

print(df,'\n')
#指定填充的值
print(df.fillna(0))
#取对应列的上一行数据
print(df.ffill())
#取对应列的下一行数据
print(df.bfill())

输出为:
年龄
0 23.0
1 3.0
2 13.0
3 NaN
4 5.0

年龄
0 23.0
1 3.0
2 13.0
3 0.0
4 5.0
年龄
0 23.0
1 3.0
2 13.0
3 13.0
4 5.0
年龄
0 23.0
1 3.0
2 13.0
3 5.0
4 5.0

多有的空值补充函数都不会覆盖原来对象,需要设置inplace=True参数才能覆盖。

去重:

import pandas as pd


df = pd.DataFrame([23,3,3,13,None,5],columns=['年龄'])

print(df,'\n')
print(df.drop_duplicates())
print(df)
df.drop_duplicates(inplace=True)
print(df)

输出为:
年龄
0 23.0
1 3.0
2 3.0
3 13.0
4 NaN
5 5.0

年龄
0 23.0
1 3.0
3 13.0
4 NaN
5 5.0
年龄
0 23.0
1 3.0
2 3.0
3 13.0
4 NaN
5 5.0
年龄
0 23.0
1 3.0
3 13.0
4 NaN
5 5.0

9、DataFrame的数据库查询

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8")

#SQL查询
def query(sql,engine):
    return pd.read_sql(sql, engine, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)

df = query('select * from a limit 1',engine)
print(type(df))
print(df)

输出为:
<class ‘pandas.core.frame.DataFrame’>
id no name SYSTEM_SOURCE
0 1 1 哈哈 Z

参数详情:
sql : 要执行的SQL查询。

con : SQLAlchemy可连接(引擎/连接)或数据库字符串URI或DBAPI2连接(后备模式)使用SQLAlchemy可以使用该库支持的任何数据库。如果是DBAPI2对象,则仅支持sqlite3。

index_col : 字符串或字符串列表,可选,默认值:无。要设置为索引的列(MultiIndex)。

coerce_float : boolean,默认为True
尝试将非字符串,非数字对象(如decimal.Decimal)的值转换为浮点,这对SQL结果集很有用。

params : list,tuple或dict,optional,默认值:None
要传递给执行方法的参数列表。用于传递参数的语法取决于数据库驱动程序。检查数据库驱动程序文档,了解支持PEP 249的paramstyle中描述的五种语法样式。例如。对于psycopg2,使用%(name)s所以使用params = {‘name’:‘value’}

parse_dates : list或dict,默认值:None
要解析为日期的列名列表。
在解析字符串时间时格式字符串与strftime兼容的位置的字典,或者在解析整数时间戳的情况下是(D,s,ns,ms,us)之一。{column_name: format string}
dict of ,其中arg dict对应于关键字参数。 特别适用于没有本机Datetime支持的数据库,例如SQLite。{column_name: arg dict}pandas.to_datetime()
columns : list,默认值:None
从SQL表中选择的列名列表(仅在读取表时使用)。

chunksize : int,默认无
如果指定,则返回一个迭代器,其中chunksize是要包含在每个块中的行数。

10、DataFrame插入数据库

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8")

df = pd.DataFrame([['5','泷泽萝拉','岛国']],columns=['no','name','SYSTEM_SOURCE'])
#第一个参数为DataFrame格式的数据,第二个参数为表名,第三个参数为数据库连接,第四个为库名,第五个即存在相同的重复插入。这里的set_index是将no设置为索引列,如果不这样设置,它会默认的插入多一列index的索引列,因为数据库表是没有这一列的,这样会导致报错。
pd.io.sql.to_sql(df.set_index('no'),'a',engine,schema='test',if_exists='append')

在这里插入图片描述

11、python去除字符串前后指定值

去空格:

import pandas as pd


s = ' sskc ufss '
s = s.strip()
print(s)
s = s.lstrip('s')
print(s)
s = s.rstrip('s')
print(s)

输出为:
sskc ufss
kc ufss
kc uf

strip、lstrip、rstrip默认是去除空格,可以指定值进行去除。

未完待续,有空更新。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值