导入pandas和numpy
import pandas as pd
import numpy as np
创建对象
Series对象
通过传入一个list列表来创建Series,默认的index是从0开始的整数。
s = pd.Series([1,2,3,np.nan,7,3])
print(s)
#output
0 1.0
1 2.0
2 3.0
3 NaN
4 7.0
5 3.0
dtype: float64
DataFrame对象
dates = pd.date_range("20130101", periods=6)
print(dates)
#output
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list("ABCD"))
#output
A B C D
2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
2013-01-02 1.212112 -0.173215 0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
2013-01-04 0.721555 -0.706771 -1.039575 0.271860
2013-01-05 -0.424972 0.567020 0.276232 -1.087401
2013-01-06 -0.673690 0.113648 -1.478427 0.524988
查看数据
查看各列的数据类型
print(df.dtypes)
查看对表的数据分析
print(df.describe())
df.head() #查看前几行
df.taile(5) #查看后5行
df.index #查看行索引
df.columns #查看列标签
ndf = df.T #对df的转置
将数据表转为numpy数组格式
df.to_numpy()
注意: df.to_numpy()方法对于统一的数字类型转换是很快的,但是对于各列数据类型不同的df来说是很费劲的,不推荐这么做。
排序
- 根据index排序 sort_index
df.sort_index(axis=1,ascending=False) #表示对列进行排序,默认为升序,这里为降序
D C B A
2013-01-01 -1.135632 -1.509059 -0.282863 0.469112
2013-01-02 -1.044236 0.119209 -0.173215 1.212112
2013-01-03 1.071804 -0.494929 -2.104569 -0.861849
2013-01-04 0.271860 -1.039575 -0.706771 0.721555
2013-01-05 -1.087401 0.276232 0.567020 -0.424972
2013-01-06 0.524988 -1.478427 0.113648 -0.673690
#可以看到这种排序的结果就是列的前后顺序变化
df.sort_index(axis=0,ascending=False)
A B C D
2022-03-07 0.701706 0.121685 0.814932 -0.024373
2022-03-06 -1.678984 -0.022840 -1.206375 0.657458
2022-03-05 -1.380990 -0.744769 0.724624 -0.868785
2022-03-04 -0.132180 -0.993480 1.592413 0.042532
2022-03-03 2.628804 0.904721 0.570431 -0.430371
2022-03-02 0.250621 -1.186890 1.245024 0.256989
2022-03-01 -1.645258 2.799524 0.451530 0.134965
#可以看到是根据行标签进行排序了
注意:默认sort_index(axis=0,ascending=True),另外0等价于‘index’,1等价于’columns’,也就是可以写成df.sort_index(axis=‘index’)的形式。
- 根据value排序 sort_values
df.sort_values(by='A') #根据第A列的值排序,默认是升序
df.sort_values(by=['A','B']) #根据第A,B列的值排序,先排A再排B
选择数据
官方注意:pandas中有标准的python或者numpy选择数据的表达式,直观、交互性好、容易上手,但是对于开发环境,推荐使用经过优化后的方法:.at, .iat, .loc, .iloc.
通过[ ]方式选取
#选取某列,比如A列
df['A'] #得到一个Series对象
#或者等价于
df.A
#选取几行,python的切片表达式
df[0:3]
#output
A B C D
2022-03-01 0.576333 0.130979 -0.196987 -1.072045
2022-03-02 0.026575 0.492653 0.135409 -0.063815
2022-03-03 -1.010033 -1.106872 1.198783 -1.331392
df['20220301':'20220304']
#output
A B C D
2022-03-01 0.576333 0.130979 -0.196987 -1.072045
2022-03-02 0.026575 0.492653 0.135409 -0.063815
2022-03-03 -1.010033 -1.106872 1.198783 -1.331392
2022-03-04 2.177722 0.814127 -0.800291 -0.041443
注意: 第二种通过行标签值(index)来选取的方式是包含头和尾的,而第一种通过数字下标来选取的方式是不包含尾的。
selection by label 通过标签选取 .loc
#通过index选取某行的值
temp = df.loc[dates[0]]
print(temp,type(temp)) #Series对象
A 0.576333
B 0.130979
C -0.196987
D -1.072045
Name: 2022-03-01 00:00:00, dtype: float64 <class 'pandas.core.series.Series'>
#选取某几列
df.loc[:,['A','B']]
A B
2022-03-01 0.576333 0.130979
2022-03-02 0.026575 0.492653
2022-03-03 -1.010033 -1.106872
2022-03-04 2.177722 0.814127
2022-03-05 0.019173 -0.119878
2022-03-06 1.611749 0.013235
2022-03-07 0.558080 1.061602
#根据index切片选取多行多列
df.loc['20220301':'20220304',['B','C']]
B C
2022-03-01 0.130979 -0.196987
2022-03-02 0.492653 0.135409
2022-03-03 -1.106872 1.198783
2022-03-04 0.814127 -0.800291
#或者只选取一行多列
df.loc['20220303',['A','B']]
A -1.010033
B -1.106872
Name: 2022-03-03 00:00:00, dtype: float64
#选取一个特定的值
df.loc['20220303','A']
#更快的方法
df.at[dates[0],'A']
总结: loc方法是通过标签来选取的,不论是行标签还是列标签。行标签还可以通过切片来选择,列标签则是一个列表,其形式都是 df.loc[row_label,columns_list]的形式。
另外,对于标量的选取,df.at[row_label,column_label]
更加快速。
selection by position 通过位置选取 .iloc[]
不同于df.loc[]的方式在于传入的参数都是数字,通过数字下标来选择数据。
#选择某一行
df.iloc[3]
A 2.177722
B 0.814127
C -0.800291
D -0.041443
Name: 2022-03-04 00:00:00, dtype: float64
#选择某几行
df.iloc[1:3] #不包含3 等价于 df.iloc[1:3,:]
A B C D
2022-03-02 0.026575 0.492653 0.135409 -0.063815
2022-03-03 -1.010033 -1.106872 1.198783 -1.331392
#选择某几行,某几列
df.iloc[1:3,0:2]
A B
2022-03-02 0.026575 0.492653
2022-03-03 -1.010033 -1.106872
#选择某几行,所有列
df.iloc[1:3,:]
A B C D
2022-03-02 0.026575 0.492653 0.135409 -0.063815
2022-03-03 -1.010033 -1.106872 1.198783 -1.331392
#选择某几列,所有行
df.iloc[:,0:2]
A B
2022-03-01 0.576333 0.130979
2022-03-02 0.026575 0.492653
2022-03-03 -1.010033 -1.106872
2022-03-04 2.177722 0.814127
2022-03-05 0.019173 -0.119878
2022-03-06 1.611749 0.013235
2022-03-07 0.558080 1.061602
#离散选择某几行
df.iloc[[1,2,4]]
A B C D
2022-03-02 0.026575 0.492653 0.135409 -0.063815
2022-03-03 -1.010033 -1.106872 1.198783 -1.331392
2022-03-05 0.019173 -0.119878 1.499951 -0.845860
#离散选择某几行,某几列
df.iloc[[1,2,4],[0,2]]
A C
2022-03-02 0.026575 0.135409
2022-03-03 -1.010033 1.198783
2022-03-05 0.019173 1.499951
#选择一个标量
df.iloc[0,2]
-0.19698718556627817
#更快的方法
df.iat[0,2]
-0.19698718556627817
总结: 注意到不管是通过标签选取还是通过位置下标选取一个标量,都对应提供了at方法(
df.at[row_index,column_label]
,df.iat[row_number,column_number]
)
布尔条件选取
#选择A列数据大于0的行
df[df['A']>0]
A B C D
2022-03-01 0.576333 0.130979 -0.196987 -1.072045
2022-03-02 0.026575 0.492653 0.135409 -0.063815
2022-03-04 2.177722 0.814127 -0.800291 -0.041443
2022-03-05 0.019173 -0.119878 1.499951 -0.845860
2022-03-06 1.611749 0.013235 0.722563 -0.682336
2022-03-07 0.558080 1.061602 -0.228625 0.584362
#选出所有数据中大于0的,空出来的位置用nan填充
df[df>0]
A B C D
2022-03-01 0.576333 0.130979 NaN NaN
2022-03-02 0.026575 0.492653 0.135409 NaN
2022-03-03 NaN NaN 1.198783 NaN
2022-03-04 2.177722 0.814127 NaN NaN
2022-03-05 0.019173 NaN 1.499951 NaN
2022-03-06 1.611749 0.013235 0.722563 NaN
2022-03-07 0.558080 1.061602 NaN 0.584362
#使用isin()判断是否包含
#新增一列离散数据
df['E'] = ['one','two','three','four','five','six','seven']
print(df)
A B C D E
2022-03-01 0.576333 0.130979 -0.196987 -1.072045 one
2022-03-02 0.026575 0.492653 0.135409 -0.063815 two
2022-03-03 -1.010033 -1.106872 1.198783 -1.331392 three
2022-03-04 2.177722 0.814127 -0.800291 -0.041443 four
2022-03-05 0.019173 -0.119878 1.499951 -0.845860 five
2022-03-06 1.611749 0.013235 0.722563 -0.682336 six
2022-03-07 0.558080 1.061602 -0.228625 0.584362 seven
用
isin()
判断是否包含
df[df['E'].isin(['one','three'])]
A B C D E
2022-03-01 0.576333 0.130979 -0.196987 -1.072045 one
2022-03-03 -1.010033 -1.106872 1.198783 -1.331392 three
setting 设置
新增一列
s1 = pd.Series([1, 2, 3, 4, 5, 6,7], index=pd.date_range("20220301", periods=7))
df['F'] = s1
修改值
df.at[dates[0],'A'] = 0
df.iat[0,1] = 0
df.loc[:,'D'] = np.array([5]*len(df)) #将D列修改
df2= df.copy() #复制df
df2[df2>0] = -df2 #将所有大于0的值都取反
missing data数据缺失
Reindexing allows you to change/add/delete the index on a specified axis. This returns a copy of the data.
重新设置index能够改变、增加或者删除原来的index,返回结果是原数据的复制。
df.reindex
df2 = df.reindex(index=dates[0:4],columns=list(df.columns)+["E"])
print(df2)
A B C D E
2022-03-01 0.576333 0.130979 -0.196987 -1.072045 NaN
2022-03-02 0.026575 0.492653 0.135409 -0.063815 NaN
2022-03-03 -1.010033 -1.106872 1.198783 -1.331392 NaN
2022-03-04 2.177722 0.814127 -0.800291 -0.041443 NaN
设置缺失值
df2.loc[dates[0]:dates[1],'E'] = 1
df2.iloc[1,1] = np.nan
print(df2)
A B C D E
2022-03-01 0.576333 0.130979 -0.196987 -1.072045 1.0
2022-03-02 0.026575 NaN 0.135409 -0.063815 1.0
2022-03-03 -1.010033 -1.106872 1.198783 -1.331392 NaN
2022-03-04 2.177722 0.814127 -0.800291 -0.041443 NaN
df.dropna()删除带有缺失值的行
ndf = df2.dropna(how='any')
print(ndf)
A B C D E
2022-03-01 0.576333 0.130979 -0.196987 -1.072045 1.0
缺失值填充df.fillna()
df2.fillna(value=0)
print(df2)
A B C D E
2022-03-01 0.576333 0.130979 -0.196987 -1.072045 1.0
2022-03-02 0.026575 NaN 0.135409 -0.063815 1.0
2022-03-03 -1.010033 -1.106872 1.198783 -1.331392 NaN
2022-03-04 2.177722 0.814127 -0.800291 -0.041443 NaN
是否是缺失值一览表pd.isna(df)
pd.isna(df2)
A B C D E
2022-03-01 False False False False False
2022-03-02 False True False False False
2022-03-03 False False False False True
2022-03-04 False False False False True
统计操作
统计操作一般都会忽略缺失值
求均值
df.mean() #默认是对每一列数据求均值
A 0.565657
B 0.183692
C 0.332972
D -0.493218
dtype: float64
df.mean(1) #对每一行数据求均值,也可以写成df.mean(axis='columns')
2022-03-01 -0.140430
2022-03-02 0.147705
2022-03-03 -0.562379
2022-03-04 0.537529
2022-03-05 0.138347
2022-03-06 0.416303
2022-03-07 0.493855
Freq: D, dtype: float64
apply
df.apply(np.cumsum) #按行累加,返回的还是df
df.apply(lambda x:x.max()-x.min()) #默认x表示行,对行操作
A 3.187755
B 2.168475
C 2.300242
D 1.915754
dtype: float64
#也可以对列操作
df.apply(lambda x: x.max()-x.min(),axis='columns')
2022-03-01 1.648378
2022-03-02 0.556468
2022-03-03 2.530175
2022-03-04 2.978013
2022-03-05 2.345811
2022-03-06 2.294084
2022-03-07 1.290228
Freq: D, dtype: float64
merge 融合
concat
df = pd.DataFrame(np.random.randn(10,4))
#break
pieces = [df[:3],df[3:7],df[7:]]
#concat
df = pd.concat(pieces)
官方注意: 向一个df添加一列是方便的,但是添加一行需要copy,代价是昂贵的,所以建议传入一个提前构建好的数据(例如Series)给df也不要迭代地一行一行添加数据。
……后面的自己看官网吧,详细的也得看官网教程。