pandas内容简单介绍
1、创建对象以及二维表
创建对象,pd.Series(),类似一维数组。
import numpy as np
import pandas as pd
a = np.array([60, 89, 98])
a
#array([60, 89, 98])
b = pd.Series(a, index=['xiaoming', 'xiaohong', 'xiaohua'])
b
'''
xiaoming 60
xiaohong 89
xiaohua 98
dtype: int64
'''
#pd.Series(),创建pandas对象,第一个参数可以是数组,数列,字典;第二个参数是索引
pd.Series({'xiaoming':60, "xiaohong": 89})
'''
xiaoming 60
xiaohong 89
dtype: int64
'''
#第一个参数是字典时,字典的键是索引
#因此可以通过b.keys获得数据集b的索引,b.values获得数据集b的值。
创建二维表 DataFrame
行索引标签:index;列索引标签:columns
import numpy as np
import pandas as pd
s = pd.DataFrame([[60, 70, 80], [89, 78, 67]])
s
#```pd.DataFrame()的参数可以是数组,也可以是嵌套列表
#index修改
s.index = ['xiaohong', 'xiaoming']
#columns修改
s.columns = ['chinese', 'math', 'english']
#创建二维表时,就一步到位
s = pd.DataFrame([[60, 70, 80], [89, 78, 67]], index=['xiaohong', 'xiaoming'],
columns=['chainese', 'math', 'englishe'])
#这是横、列索引,数据分开表示进行创建的。
pd.DataFrame({'chinese':[60, 89], 'math':[70, 78], 'english':[80, 67]},
index=['xiaohong', 'xiaoming'])
#列索引是字典的键,行索引是index内容,字典的值是数据
2、series对象以及dataframe对象的索引和切片
series对象的索引和切片
import numpy as np
import pandas as pd
s = pd.Series([90, 89, 88, 87, 86], index=['zhang', 'wang', 'li', 'zhao', 'sun'])
s
"""
zhang 90
wang 89
li 88
zhao 87
sun 86
dtype: int64
"""
#索引
s['zhang']
#90
#修改数据
s['zhang'] = 100
s['zhang']
#100
#列表索引,返回的是数据+索引标签
s[['zhang', 'wang']]
'''
zhang 100
wang 89
dtype: int64
'''
#条件索引,是关于数据的条件,返回符合条件的数据+索引标签
s[s>88]
'''
zhang 100
wang 89
dtype: int64
'''
#遇到索引标签是数字的,使用.loc(标签索引)和.iloc(位置索引)
ts = pd.Series(np.random.randn(4), index=[1, 3, 5, 7])
ts
'''
1 -1.252808
3 -0.242042
5 0.351943
7 0.001299
dtype: float64
'''
ts.iloc[1]
#-0.2420420593474746
ts.loc[1]
#-1.2528078199896817
'zhang' in s
#True
#确认数据是否在数据集中,返回布尔值。
s.items()
#<zip at 0x11ecd4348>
list(s.items())
#[('zhang', 90), ('wang', 89), ('li', 88), ('zhao', 87), ('sun', 86)]
#返回是键值对
#标签切片,返回标签+数据
ts.loc[1:3]
'''
1 -1.252808
3 -0.242042
dtype: float64
'''
#位置切片
ts.iloc[1:3]
'''
3 -0.242042
5 0.351943
dtype: float64
'''
dataframe对象的索引和切片
import numpy as np
import pandas as pd
df = pd.DataFrame({'chinese': [90, 89, 87, 86, 85], 'math': [34, 35, 36, 37, 38]},
index=['zhang', 'wang', 'li', 'zhao', 'sun'])
#列索引
df['math']
'''
zhang 34
wang 35
li 36
zhao 37
sun 38
Name: math, dtype: int64
'''
#返回的行索引标签+数据,[]中的参数只能是列索引标签
#行索引
df.loc['zhang']
'''
chinese 90
math 34
Name: zhang, dtype: int64
'''
#如果是需要索引行内容,则使用.losc[行索引标签]
#返回列索引标签+数据
#修改数据
df['english'] = [56, 57, 58, 59, 60]
df.loc['zhang'] = [88,38]
#条件索引
df.loc[df['chinese']>88]
#返回二维表
'''
chinese math
zhang 90 34
wang 89 35
'''
df.values
'''
array([[90, 34],
[89, 35],
[87, 36],
[86, 37],
[85, 38]])
'''
#返回表中数据,以数组形式返回
#行标签切片
df.loc['zhang':'li']
#列标签切片
df.loc[:,'chinese': 'math']
#输出选中列
df.loc[:,'chinese', 'math']
#输出选中行中的某几列,选中行标签为'张'的行中的'chinese', 'english'两列数据
df.loc['zhang', ['chinese', 'english']]
'''
chinese 90
english 56
Name: zhang, dtype: int64
'''
3、从文件中读取数据,举例csv
import numpy as np
import pandas as pd
gdp = pd.read_csv("文件路径")
gdp
pd.read_csv(文件路径, names = ['CITY', 'GDP', 'POP'], skiprows=[0], index_col=0)
#可以自己修改行列标签索引,修改列索引标签时使用'name'参数,
#skiprows=[0] #去除掉某一行
#index_col=0 #以0列当行索引标签
gdp.set_index('City_Name')
#将'City_Name'这一列设置为行索引标签
4、分组运算
import numpy as np
import pandas as pd
gdp = pd.read_csv("文件路径")
city_gdp = gdp.set_index('City_Name')
city_gdp.mean()
#求每一列的平均值
city_gdp.mean(axis=1)
#求每一行的平均值,1轴表示横行
city_gdp.describe()
#表示每一数列的某些值,比如,数量,平均值,标准差,最小值,最大值等等
GroupBy可以分解为三个步骤:
Splitting: 把数据按主键划分为很多个小组
Applying: 对每个小组独立地使用函数
Combining: 把所得到的结果组合
Splitting 由 groupby 实现
Applying 由 agg、apply、transform、filter实现具体的操作
Combining 由 concat 等实现
df.groupby('subject').sum()
#groupby的参数是列索引坐标+.计算方法
df.groupby(['teacher', 'subject']).mean()
#如果是多个参数,使用列表
df.groupby(['teacher', 'subject'])['score'].mean()
#计算方法的数据是'score'列
df_3.groupby("name", sort=False).score.apply(lambda x: x.sum())
df_3.groupby("name", sort=False).agg({"score": [np.sum, np.max, np.min]})
#apply只能一次同时对多个列调用同一个函数;agg可以对多个列单独的调用不同的函数。
df_2.groupby("X").transform(lambda x: x + 1)
#transform作用于数据框自身,并且返回变换后的值。
#返回的对象和原对象拥有相同数目的行,但可以扩展列。
#注意返回的对象不是就地修改了原对象,而是创建了一个新对象。也就是说原对象没变
#返回一个类似于数组的序列,且对每一个组,依次在每一列上调用函数。
df_9.groupby('A').filter(lambda x: x['B'].mean() > 3.)
#filter是一个过滤器,是一个组内方法