打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
2

Pandas库

Pandas是基于NumPy 的一种工具,其出现是为了解决数据分析任务。
Pandas吸纳了大量库和一些标准的数据模型,提供了高效操作大型数据集所需的工具。
Pandas中的函数和方法能够使我们快速便捷地处理数据。
它是使Python成为强大而高效的数据分析环境的重要因素之一。
http://pandas.pydata.org/pandas-docs/stable/api.html

x
import numpy as np

一、序列Series

序列Series是一个一维数组结构,可以存入任一种Python数据类型(integers, strings, floating point numbers, Python objects, 等等)
序列Series由两部分构成,一个是index,另一个是对应的值,注意两者的长度必须一样。序列Series和数组array很类似,大多数numpy的函数都可以直接应用与序列Series
序列Series也像一个固定大小的字典dict,可以通过index来赋值或者取值

1.1 序列Series生成

1
print('通过数组来生成序列Series')
通过数组来生成序列Series
1
print('通过字典来生成序列Series')
通过字典来生成序列Series

1.2 序列Series性质和计算

1
s = pd.Series(np.random.randn(5), index = ['a','b','c','d','e'])
1
# 可以通过index来查看序列Series中的元素
查看序列中index为a的元素: -0.768297170466查看序列中index为a,c,e的元素: a -0.768297c 0.830632e 0.659834dtype: float64
1
# 基于index 可以修改序列s中的元素
原序列: a -0.335816b -1.353967c 1.538221d 0.095480e 0.959191dtype: float64修改后的序列: a 1.000000e+09b -1.353967e+00c 1.538221e+00d 9.547957e-02e 9.591910e-01dtype: float64
1
s = pd.Series(np.random.randn(5), index = ['a','b','c','d','e'])
原序列: a -0.335816b -1.353967c 1.538221d 0.095480e 0.959191dtype: float64序列相加: a -0.671633b -2.707934c 3.076441d 0.190959e 1.918382dtype: float64序列每个元素求指数: a 0.714754b 0.258214c 4.656298d 1.100186e 2.609585dtype: float64
1
s = pd.Series(np.random.randint(1,5,5), index = ['a','b','c','d','e'])
查看序列s的index: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')查看序列的值: [3 3 3 4 1]序列s的一阶差分: a NaNb 0.0c 0.0d 1.0e -3.0dtype: float64
1
ss = pd.Series(np.random.randint(1,3,100))
0 21 12 13 14 25 16 17 18 29 2dtype: int64查看序列的唯一取值: [2 1]

二、数据框DataFrame

数据框DataFrame是一个二维数组结构,可以存入任一种Python数据类型(integers, strings, floating point numbers, Python objects, 等等)
数据框DataFrame由三部分构成,一个是行索引index,一个是列名,另一个则是取值。

2.1 数据框生成

1
print('由字典来产生数据框')
由字典来产生数据框
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
1
print('由列表来产生数据框')
由列表来产生数据框
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9

2.2 数据框基本性质

1
data = pd.DataFrame(np.random.randint(1,100,(10,4)),columns=['x1','x2','x3','x4'])
首先查看数据框的形状 (10, 4)查看数据框的头部: x1 x2 x3 x40 12 17 65 441 66 92 12 512 27 15 64 353 31 28 77 304 81 33 99 19---------------------查看数据框的尾部: x1 x2 x3 x45 4 13 10 866 57 29 43 357 91 1 62 728 42 49 51 799 53 93 13 79---------------------查看数据框的索引indexRangeIndex(start=0, stop=10, step=1)
1
print('查看数据框的列名')
查看数据框的列名Index(['x1', 'x2', 'x3', 'x4'], dtype='object')---------------------查看数据框的值,其格式为数组array[[84 96 51 91] [73 35 53 66] [31 83 46 87] [ 3 16 74 69] [88 29 37 67] [90 88 83 86] [ 1 46 3 63] [53 33 31 87] [40 80 5 1] [15 67 36 97]]---------------------查看数据框的基础描述性统计 x1 x2 x3 x4count 10.000000 10.000000 10.000000 10.000000mean 47.800000 57.300000 41.900000 71.400000std 34.937404 28.736543 25.808913 27.528571min 1.000000 16.000000 3.000000 1.00000025% 19.000000 33.500000 32.250000 66.25000050% 46.500000 56.500000 41.500000 77.50000075% 81.250000 82.250000 52.500000 87.000000max 90.000000 96.000000 83.000000 97.000000
1
# 在原有的数据框中新加入一列
x1 x2 x3 x4 新列
0 84 96 51 91 HAHA
1 73 35 53 66 HAHA
2 31 83 46 87 HAHA
3 3 16 74 69 HAHA
4 88 29 37 67 HAHA
5 90 88 83 86 HAHA
6 1 46 3 63 HAHA
7 53 33 31 87 HAHA
8 40 80 5 1 HAHA
9 15 67 36 97 HAHA
1
# 数据框的转置
0 1 2 3 4 5 6 7 8 9
x1 84 73 31 3 88 90 1 53 40 15
x2 96 35 83 16 29 88 46 33 80 67
x3 51 53 46 74 37 83 3 31 5 36
x4 91 66 87 69 67 86 63 87 1 97
新列 HAHA HAHA HAHA HAHA HAHA HAHA HAHA HAHA HAHA HAHA

2.3 数据框截取

2.3.1 行截取

1
print('查看数据框data索引为1的行——方法一')
查看数据框data索引为1的行——方法一x1 66x2 92x3 12x4 51Name: 1, dtype: int64---------------------查看数据框data索引为1的行——方法二x1 66x2 92x3 12x4 51Name: 1, dtype: int64---------------------查看数据框data前3行 x1 x2 x3 x40 12 17 65 441 66 92 12 512 27 15 64 35

2.3.2 列截取

1
print('数据框data的x3列选取')
数据框data的x3列选取0 651 122 643 774 995 106 437 628 519 13Name: x3, dtype: int64---------------------数据框data的x3,x4两列同时选取 x3 x40 65 441 12 512 64 353 77 304 99 195 10 866 43 357 62 728 51 799 13 79

2.3.3 数据框行列同时截取

1
print('截取数据框data的前4行的x3和x4列')
截取数据框data的前4行的x3和x4列
x3 x4
0 65 44
1 12 51
2 64 35
3 77 30

2.3.4 数据框条件截取

1
print('截取数据框x3大于等于50的记录')
截取数据框x3大于等于50的记录 x1 x2 x3 x40 12 17 65 442 27 15 64 353 31 28 77 304 81 33 99 197 91 1 62 728 42 49 51 79---------------------截取数据框x3大于20且x4小于50的记录 x1 x2 x3 x40 12 17 65 442 27 15 64 353 31 28 77 304 81 33 99 196 57 29 43 35---------------------截取数据框x3大于20的x1列0 122 273 314 817 918 42Name: x1, dtype: int64

2.4 数据框缺失值处理

例如下面这个数据框data,其中就存在缺失值

1
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
pop state year
0 1.5 Ohio 2000
1 NaN Ohio 2001
2 3.6 Ohio 2002
3 2.4 None 2001
4 2.9 Nevada 2002
1
data.dropna()
pop state year
0 1.5 Ohio 2000
2 3.6 Ohio 2002
4 2.9 Nevada 2002
1
data.dropna(how='all')
pop state year
0 1.5 Ohio 2000
1 NaN Ohio 2001
2 3.6 Ohio 2002
3 2.4 None 2001
4 2.9 Nevada 2002
1
data.dropna(how='all', axis=1)
pop state year
0 1.5 Ohio 2000
1 NaN Ohio 2001
2 3.6 Ohio 2002
3 2.4 None 2001
4 2.9 Nevada 2002
1
data.dropna(thresh=3, axis=0)
pop state year
0 1.5 Ohio 2000
2 3.6 Ohio 2002
4 2.9 Nevada 2002
1
data.dropna(thresh=3, axis=1)
pop state year
0 1.5 Ohio 2000
1 NaN Ohio 2001
2 3.6 Ohio 2002
3 2.4 None 2001
4 2.9 Nevada 2002

上面对缺失值的处理都是将缺失值剔除,下面介绍了填充缺失值的方法

1
data
pop state year
0 1.5 Ohio 2000
1 NaN Ohio 2001
2 3.6 Ohio 2002
3 2.4 None 2001
4 2.9 Nevada 2002
1
print('用0填充数据框中的缺失值,0是可选参数之一')
用0填充数据框中的缺失值,0是可选参数之一
pop state year
0 1.5 Ohio 2000
1 0.0 Ohio 2001
2 3.6 Ohio 2002
3 2.4 0 2001
4 2.9 Nevada 2002
1
data.fillna(method='ffill')
pop state year
0 1.5 Ohio 2000
1 1.5 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Ohio 2001
4 2.9 Nevada 2002
1
data.fillna(method='bfill')
pop state year
0 1.5 Ohio 2000
1 3.6 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002

2.5 数据框排序

1
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
1
print('数据框data按列pop降序排序')
数据框data按列pop降序排序
pop state year
2 3.6 Ohio 2002
4 2.9 Nevada 2002
3 2.4 Nevada 2001
1 1.7 Ohio 2001
0 1.5 Ohio 2000
1
print('数据框data按列pop升序排序')
数据框data按列pop升序排序
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
3 2.4 Nevada 2001
4 2.9 Nevada 2002
2 3.6 Ohio 2002
1
print('数据框data按行索引index降序排序')
数据框data按行索引index降序排序
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002

2.6 数据框的基本函数

1
print('按列求均值')
按列求均值
1
print('按行求均值')
按行求均值

函数汇总
下面的函数都是通过数据框.函数名(参数设置)来进行调用,一般的参数是axis=0/1,选择为0则是按行来实现函数,1则是按列来实现函数


序号函数函数含义
1count计数非na值
2describe针对Series或个DataFrame列基本描述统计
3min、max计算最小值和最大值
4argmin、argmax获取到最大值和最小值的索引位置(整数)
5idxmin、idxmax计算能够获取到最大值和最小值得索引值
6quantile计算样本的分位数(0到1)
7sum求和
8mean求平均数
9median求中位数(50%分位数)
10mad计算平均绝对离差
11var样本方差
12std样本标准差
13skew样本偏度(三阶矩)
14kurt样本峰度(四阶矩)
15cumsum样本累计和
16cummin,cummax样本累计最大值和累计最小值
17cumprod样本累计积
18diff计算一阶差分
19pct_change计算百分数变化
20corr计数相关性

2.7 数据框拼接

下面介绍了三个函数来实现数据框的拼接功能——concat函数,merge函数和join函数

2.7.1 数据框拼接—pd.concat

1
data1 = pd.DataFrame(np.random.randn(4,3),index=['a','b','c','d'],columns=['x1','x2','x3'])
x1 x2 x3
a 0.194063 -0.775257 0.750544
b -0.362398 -0.256831 1.845307
c 0.440129 -0.973812 1.266275
d 0.310613 -0.830704 1.210340
1
data2 = pd.DataFrame(np.random.randn(4,3),index=['e','f','g','h'],columns=['x1','x2','x3'])
x1 x2 x3
e -0.578014 1.033819 1.613378
f 0.769962 0.079661 0.686825
g -0.149230 0.940921 0.443839
h -1.430560 -0.924091 0.499845
1
print('按行拼接')
按行拼接
x1 x2 x3
a 0.194063 -0.775257 0.750544
b -0.362398 -0.256831 1.845307
c 0.440129 -0.973812 1.266275
d 0.310613 -0.830704 1.210340
e -0.578014 1.033819 1.613378
f 0.769962 0.079661 0.686825
g -0.149230 0.940921 0.443839
h -1.430560 -0.924091 0.499845
1
data1 = pd.DataFrame(np.random.randn(4,3),index=['a','b','c','d'],columns=['x1','x2','x3'])
x1 x2 x3
a 0.994641 -1.062699 0.033700
b -0.538477 -0.739688 0.495250
c 0.111017 0.689445 0.972465
d -0.954307 0.423636 -1.295699
1
data2 = pd.DataFrame(np.random.randn(4,3),index=['a','b','c','e'],columns=['x1','x3','x4'])
x1 x3 x4
a 1.365262 -1.844937 -2.072812
b -0.772867 0.201976 -0.024210
c -0.349105 -0.763815 0.135989
e -0.163869 -0.723870 1.043185
1
print('按列拼接')
按列拼接

2.7.3 数据框拼接—pd.merge

pd.merge一般针对的是按列合并。
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False)

  1. left: 一个dataframe对象
  2. right: 另一个dataframe对象
  3. how: 可以是'left', 'right', 'outer', 'inner'. 默认为inner。
  4. on: 列名,两个dataframe都有的列。如果不传参数,而且left_index和right_index也等于False,则默认把两者交叉/共有的列作为链接键(join keys)。可以是一个列名,也可以是包含多个列名的list。
  5. left_on: 左边dataframe的列会用做keys。可以是列名,或者与dataframe长度相同的矩阵array。
  6. right_on: 右边同上。
  7. left_index: 如果为Ture,用左侧dataframe的index作为连接键。如果是多维索引,level数要跟右边相同才行。
  8. right_index: 右边同上。
  9. sort: 对合并后的数据框排序,以连接键。
  10. suffixes: 一个tuple,包字符串后缀,用来加在重叠的列名后面。默认是('_x','_y')。
  11. copy: 默认Ture,复制数据。
  12. indicator: 布尔型(True/FALSE),或是字符串。如果为True,合并之后会增加一列叫做'_merge'。是分类数据,用left_only, right_only, both来标记来自左边,右边和两边的数据。

参考:http://www.jianshu.com/p/dc8ba1c0eada

1
left_data = pd.DataFrame({'time':['2017-09-11','2017-09-12','2017-09-13'],
time x1 x2
0 2017-09-11 1 2
1 2017-09-12 2 2
2 2017-09-13 3 1
1
right_data = pd.DataFrame({'time':['2017-09-10','2017-09-11','2017-09-12'],
time x3 x4
0 2017-09-10 -1 2
1 2017-09-11 -1 -100
2 2017-09-12 10 0

希望将上面两个数据框left_data和right_data拼接起来,但要求是按照时间来进行拼接

1
print('按time拼接,只保留共同的部分')
按time拼接,只保留共同的部分
time x1 x2 x3 x4
0 2017-09-11 1 2 -1 -100
1 2017-09-12 2 2 10 0
1
print('按time拼接,但所有的数据都保留下来')
按time拼接,但所有的数据都保留下来
time x1 x2 x3 x4
0 2017-09-11 1.0 2.0 -1.0 -100.0
1 2017-09-12 2.0 2.0 10.0 0.0
2 2017-09-13 3.0 1.0 NaN NaN
3 2017-09-10 NaN NaN -1.0 2.0
1
print('按time拼接,但所有的数据都保留下来,且生成一列来表示数据的来源')
按time拼接,但所有的数据都保留下来,且生成一列来表示数据的来源
time x1 x2 x3 x4 数据来源
0 2017-09-11 1.0 2.0 -1.0 -100.0 both
1 2017-09-12 2.0 2.0 10.0 0.0 both
2 2017-09-13 3.0 1.0 NaN NaN left_only
3 2017-09-10 NaN NaN -1.0 2.0 right_only

2.7.4 数据框拼接—.join

DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)

  1. other:一个DataFrame、Series(要有命名),或者DataFrame组成的list。
  2. on:列名,包含列名的list或tuple,或矩阵样子的列 (如果是多列,必须有MultiIndex)。 跟上面的几种方法一样,用来指明依据哪一列进行合并。 如果没有赋值,则依据两个数据框的index合并。
  3. how:合并方式, {‘left’, ‘right’, ‘outer’, ‘inner’}, 默认‘left‘。
  4. lsuffix:字符串。用于左侧数据框的重复列。 把重复列重新命名,原来的列名+字符串。 【如果有重复列,必须添加这个参数。】
  5. rsuffix:同上。右侧。
  6. sort:布尔型,默认False。如果为True,将链接键(on的那列)按字母排序。

参考:http://www.jianshu.com/p/dc8ba1c0eada

1
left_data = pd.DataFrame({'time':['2017-09-11','2017-09-12','2017-09-13'],
time x1 x2
0 2017-09-11 1 2
1 2017-09-12 2 2
2 2017-09-13 3 1
1
right_data = pd.DataFrame({'time':['2017-09-10','2017-09-11','2017-09-12'],
time x2 x4
0 2017-09-10 -1 2
1 2017-09-11 -1 -100
2 2017-09-12 10 0
1
print('注意到两个拼接的数据框,含有相同的列x2和time,故重新命名了这两个列')
注意到两个拼接的数据框,含有相同的列x2和time,故重新命名了这两个列
time_left x1 x2_left time_right x2_right x4
0 2017-09-11 1 2 2017-09-10 -1 2
1 2017-09-12 2 2 2017-09-11 -1 -100
2 2017-09-13 3 1 2017-09-12 10 0

2.8 数据框重复值剔除

有时候,希望能够剔除掉数据框中的重复记录

1
data = pd.concat([left_data,left_data],axis=0)
time x1 x2
0 2017-09-11 1 2
1 2017-09-12 2 2
2 2017-09-13 3 1
0 2017-09-11 1 2
1 2017-09-12 2 2
2 2017-09-13 3 1
1
print('查看数据框中是否存在重复记录,标记为True的为重复记录')
查看数据框中是否存在重复记录,标记为True的为重复记录
1
print('剔除数据框中的重复记录')
剔除数据框中的重复记录
time x1 x2
0 2017-09-11 1 2
1 2017-09-12 2 2
2 2017-09-13 3 1

2.9 基于pandas的文件操作

在进行数据分析之前,可能需要读写自己的数据文件。或者在完成数据分析之后,想把结果输出到外部的文件
在Python中,利用pandas模块中的几个函数,可以轻松实现这些功能,利用pandas读取文件之后数据的格式为数据框,且如果想用pandas将数据输出为外部文件,也要先确保要输出的文件的格式为数据框
注意在运行下面的程序之前,需要确保文件已经在目录下,这里需要将文件上传到万矿网的数据文件目录

2.9.1 读取txt文件

1
text = pd.read_table('data/training/test2.txt',index_col=0,delimiter=' ')
x1 x2 x3 y
day
0 1 2 3 0
1 2 2 2 1
2 3 1 1 1
3 2 1 1 0

2.9.2 读取excel/csv文件

1
import pandas as pd
1
data_excel = pd.read_excel('data/training/test3.xlsx')
代码 名称 证券简称 上市日期 所属申万行业 近10日涨跌幅 近1月涨跌幅 近3月涨跌幅
0 002161.SZ 远望谷 远望谷 2007-08-21 其他电子Ⅲ -1.411290 -13.143872 -20.681265
1 002162.SZ 悦心健康 悦心健康 2007-08-23 其他建材Ⅲ -2.460457 -7.035176 -7.960199
2 002699.SZ 美盛文化 美盛文化 2012-09-11 其他服装 -1.148796 -3.317282 33.357934
3 600009.SH 上海机场 上海机场 1998-02-18 机场Ⅲ -1.872321 8.641359 17.823843
4 600115.SH 东方航空 东方航空 1997-11-05 航空运输Ⅲ 1.183432 3.012048 1.333333
1
data_csv = pd.read_csv('data/training/test3_csv.csv',encoding='GBK')
代码 名称 证券简称 上市日期 所属申万行业 近10日涨跌幅 近1月涨跌幅 近3月涨跌幅
0 002161.SZ 远望谷 远望谷 2007-08-21 其他电子Ⅲ -1.4113 -13.1439 -20.6813
1 002162.SZ 悦心健康 悦心健康 2007-08-23 其他建材Ⅲ -2.4605 -7.0352 -7.9602
2 002699.SZ 美盛文化 美盛文化 2012-09-11 其他服装 -1.1488 -3.3173 33.3579
3 600009.SH 上海机场 上海机场 1998-02-18 机场Ⅲ -1.8723 8.6414 17.8238
4 600115.SH 东方航空 东方航空 1997-11-05 航空运输Ⅲ 1.1834 3.0120 1.3333

2.9.3 输出为excel/csv文件

由于使用了pandas库,我们在将想要的数据集输出为外部的excel/csv文件时,首先要确保文件的格式为数据框

1
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
1
# 将数据集frame输出为外部文件

2.10 数据框分组及透视表

2.10.1 分组——groupby函数

例如下面这个数据框data,希望根据地域或者性别来分组再进行数据分析

1
data = {'地域': ['上海', '上海', '非上海', '非上海', '上海','非上海','上海','上海','上海'],
x1 x2 地域 性别
0 1.5 1.051528 上海
1 1.7 -0.578360 上海
2 3.6 -1.102818 非上海
3 2.4 -1.833841 非上海
4 2.9 -0.881658 上海
5 2.2 0.733615 非上海
6 100.0 0.560502 上海
7 2.0 -0.024478 上海
8 0.0 -2.407576 上海
1
print('按地域求x1和x2的均值')
按地域求x1和x2的均值
x1 x2
地域
上海 18.016667 -0.380007
非上海 2.733333 -0.734348
1
grouped = data.groupby('地域')
x1 x2
地域
上海 count 6.000000 6.000000
mean 18.016667 -0.380007
std 40.174490 1.221662
min 0.000000 -2.407576
25% 1.550000 -0.805834
50% 1.850000 -0.301419
75% 2.675000 0.414257
max 100.000000 1.051528
非上海 count 3.000000 3.000000
mean 2.733333 -0.734348
std 0.757188 1.322795
min 2.200000 -1.833841
25% 2.300000 -1.468330
50% 2.400000 -1.102818
75% 3.000000 -0.184601
max 3.600000 0.733615
1
print('按地域和性别求x1,x2的均值')
按地域和性别求x1,x2的均值
x1 x2
地域 性别
上海 50.85 -1.430061
1.60 -1.184690
非上海 2.30 1.280905
3.60 -0.555359
1
grouped = data.groupby(['地域','性别'])
对按地域和性别分组后的数据框,可以进行多个函数的同时操作
x1 x2
count mean max min count mean max min
地域 性别
上海 2 50.85 100.0 1.7 2 -0.718903 0.494537 -1.932343
4 1.60 2.9 0.0 4 -0.299980 0.749233 -0.885189
非上海 2 2.30 2.4 2.2 2 0.466799 1.408701 -0.475102
1 3.60 3.6 3.6 1 -0.763343 -0.763343 -0.763343
1
res.to_excel('data/training/agg.xlsx')
1
print('对不同的列可以进行不同的操作,例如对x2求均值,而对x1求和,最大值和最小值')
对不同的列可以进行不同的操作,例如对x2求均值,而对x1求和,最大值和最小值
x2 x1
mean sum max min
地域 性别
上海 -1.430061 101.7 100.0 1.7
-1.184690 6.4 2.9 0.0
非上海 1.280905 4.6 2.4 2.2
-0.555359 3.6 3.6 3.6

2.10.2 apply函数,可以对分组后的数据框进行自定义的函数操作

1
def top(data_in, n=5, column='x2'):
1
print('对数据框data按地域进行分组之后,且对于每一组,按x2排序,且输出x2最小的二条记录')
对数据框data按地域进行分组之后,且对于每一组,按x2排序,且输出x2最小的二条记录
x1 x2 地域 性别
地域
上海 6 100.0 0.494537 上海
7 2.0 0.749233 上海
非上海 3 2.4 -0.475102 非上海
5 2.2 1.408701 非上海

小例子——分组的线性回归

1
import pandas as pd

例如我们有如下数据集,希望按年分组,利用每一年的y对x进行回归

1
data = pd.DataFrame([])
x y 年份
2011-01-01 -0.421726 0.589447 2011
2011-01-02 2.420468 5.965670 2011
2011-01-03 -1.763588 -2.877965 2011
2011-01-04 -0.837336 -0.659005 2011
2011-01-05 0.431794 2.106538 2011

先对数据框by_year按年份进行分组

1
by_year = data.groupby('年份') #按年份分组

按年份分组后,求y和x之间的相关系数

1
by_year.apply(lambda g:g['y'].corr(g['x'])) #按年分组 求y和x求相关系数 注意这里使用了lambda函数

按年份分组后,y对x进行回归

1
import statsmodels.api as sm
1
def regression(data, y_name, x_name): #定义一个回归的函数
1
by_year.apply(regression,'y',['x']) #按年分组进行回归
x intercept
年份
2011 2.004851 0.999689
2012 2.002299 1.010181
2013 2.014633 1.003604
2014 1.995806 0.995565
2015 1.984045 0.998795
2016 2.010113 1.012627

2.10.3 数据透视表——pivot

1
data = {'地域': ['上海', '上海', '非上海', '非上海', '上海','非上海','上海','上海','上海'],
x1 x2 地域 性别
0 1.5 -0.025441 上海
1 1.7 1.003487 上海
2 3.6 -0.194238 非上海
3 2.4 -1.181589 非上海
4 2.9 0.095814 上海
5 2.2 -0.717525 非上海
6 100.0 -0.214724 上海
7 2.0 0.893789 上海
8 0.0 0.021405 上海
1
data.pivot_table(index='地域', columns='性别', values='x1',aggfunc='sum')
性别
地域
上海 101.7 6.4
非上海 4.6 3.6
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python数据分析-Pandas
Python pandas用法
Python中的结构化数据分析利器
Python数据分析之pandas学习(一)
关于数据分析中NumPy,Pandas,看完这一篇基本够了
pandas的一些小应用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服