10 Minutes to pandas
2017-07-21 11:48
381 查看
导入方式:
创建时间索引
指定行列索引,创建DataFrame
传递一个Series的字典,可以指定列索引,行索引与原Series一样
传递一个能够被转换成类似Series的字典来创建一个DataFrame,字典的每一个元素都被看成一个series,key即为列索引,长度不一致可以广播
查看数据类型
显示索引和数据
describe()函数 ,每一列数据的快速统计
转置行列,注意df的结构还是没有变,df1是转置后的结构
按轴排序,按照轴的索引值排序,但是排序后依然不变,需赋值才可以使用
按值进行排序,
若想用行索引,可以先转置为
好像直接
只能访问一个,不能多个,也不能切片
通过[ ]进行选择,行的切片
通过索引标签的话,包括首位
但是通过数字标号的话,不包括尾,看例子。
101cb
包括)
还可以类似numpy数组的方式切片,也可以单个,不同的是这个切片包括尾部
切片
还会进行自动维度缩减,但是还有name参数
若获取某一个标量,有快速方法
选择行
通过整数的切片,也可以是列表,总之与numpy相同,切片一般不包括尾部
快速的访问标量方法
对于所有的,则不满足的为NaN
使用
先复制再添加一列
通过标签更改某个值
获取行数
通过一个numpy数组设置一组新值
通过where操作来设置新的值
缺失为NaN
去掉包含Nan的行
填充所有的Nan
以布尔值填充
执行描述性统计,默认按0轴操作
在其他轴操作,按行求均值
对于一些算数操作,可以广播,如下,第0轴的减法。
import pandas as pd import numpy as np import matplotlib.pyplot as plt
一.创建对象
传递一个列表,创建一个Series,默认索引为整型s=pd.Series([1,3,5,np.nan,6,8]) s Out[5]: 0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64
创建时间索引
In [7]: dates=pd.date_range('20170721',periods=6)#6 个索引值 In [8]: dates Out[8]: DatetimeIndex(['2017-07-21', '2017-07-22', '2017-07-23', '2017-07-24', '2017-07-25', '2017-07-26'], dtype='datetime64[ns]', freq='D')
指定行列索引,创建DataFrame
In [9]: df=pd.DataFrame(np.random.randn(6,4),index=dates,columns['A','B','C','D']) In [10]: df Out[10]: A B C D 2017-07-21 -1.525652 0.122387 -1.259828 -1.292450 2017-07-22 0.390645 0.829519 -1.397772 0.438615 2017-07-23 0.875678 -1.159174 0.255005 -1.315799 2017-07-24 -1.754487 1.285334 0.755246 0.509824 2017-07-25 -0.787207 2.083840 0.135200 0.449318 2017-07-26 -1.036861 -0.546105 -0.580360 -0.042891
传递一个Series的字典,可以指定列索引,行索引与原Series一样
df=pd.DataFrame(s,columns=['a']) df Out[20]: a 0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0
传递一个能够被转换成类似Series的字典来创建一个DataFrame,字典的每一个元素都被看成一个series,key即为列索引,长度不一致可以广播
df2=pd.DataFrame({ 'A':1, 'B':pd.Timestamp('20170721') , 'C':pd.Series([1,2,3,4],index=['z','x','c','s']) }) df2 Out[43]: A B C z 1 2017-07-21 1 x 1 2017-07-21 2 c 1 2017-07-21 3 s 1 2017-07-21 4
查看数据类型
df2.dtypes Out[44]: A int64 B datetime64[ns] C int64 dtype: object
二.查看数据
查看头部5行和尾部5行In [48]: df.head() Out[48]: A B C D 2017-07-21 0.888811 -0.039728 0.660442 -1.056913 2017-07-22 1.267505 -0.044836 1.275167 1.035113 2017-07-23 0.125988 -1.829078 1.053110 0.074528 2017-07-24 -0.139170 -0.704593 0.208797 0.268183 2017-07-25 0.800954 0.002910 1.212054 1.790770 In [49]: df.tail() Out[49]: A B C D 2017-07-22 1.267505 -0.044836 1.275167 1.035113 2017-07-23 0.125988 -1.829078 1.053110 0.074528 2017-07-24 -0.139170 -0.704593 0.208797 0.268183 2017-07-25 0.800954 0.002910 1.212054 1.790770 2017-07-26 0.786291 -1.065658 -0.751298 -0.591745
显示索引和数据
In [50]: df.index Out[50]: DatetimeIndex(['2017-07-21', '2017-07-22', '2017-07-23', '2017-07-24', '2017-07-25', '2017-07-26'], dtype='datetime64[ns]', freq='D') In [51]: df.columns Out[51]: Index([u'A', u'B', u'C', u'D'], dtype='object') In [52]: df.values Out[52]: array([[ 0.88881115, -0.0397281 , 0.66044235, -1.05691294], [ 1.26750516, -0.04483592, 1.27516665, 1.03511314], [ 0.12598841, -1.82907844, 1.05311 , 0.07452816], [-0.13917035, -0.7045935 , 0.20879703, 0.26818348], [ 0.80095357, 0.00290982, 1.21205356, 1.79076959], [ 0.78629106, -1.06565763, -0.75129755, -0.591745 ]])
describe()函数 ,每一列数据的快速统计
In [53]: df.describe() Out[53]: A B C D count 6.000000 6.000000 6.000000 6.000000 mean 0.621730 -0.613497 0.609712 0.253323 std 0.523887 0.737961 0.776904 1.042879 min -0.139170 -1.829078 -0.751298 -1.056913 25% 0.291064 -0.975392 0.321708 -0.425177 50% 0.793622 -0.374715 0.856776 0.171356 75% 0.866847 -0.041005 1.172318 0.843381 max 1.267505 0.002910 1.275167 1.790770
转置行列,注意df的结构还是没有变,df1是转置后的结构
df1=df.T
In [55]: df.T Out[55]: 2017-07-21 2017-07-22 2017-07-23 2017-07-24 2017-07-25 2017-07-26 A 0.888811 1.267505 0.125988 -0.139170 0.800954 0.786291 B -0.039728 -0.044836 -1.829078 -0.704593 0.002910 -1.065658 C 0.660442 1.275167 1.053110 0.208797 1.212054 -0.751298 D -1.056913 1.035113 0.074528 0.268183 1.790770 -0.591745
按轴排序,按照轴的索引值排序,但是排序后依然不变,需赋值才可以使用
df.sort_index(axis=1, ascending=False)
按值进行排序,
by='某个列索引',按照这个索引的数据从小排序
df.sort_values(by='A')
若想用行索引,可以先转置为
df1=df.T
好像直接
by='某个行索引'不行啊
In [72]: df1.sort_values(by='2017-07-22') Out[72]: 2017-07-21 2017-07-22 2017-07-23 2017-07-24 2017-07-25 2017-07-26 B -0.039728 -0.044836 -1.829078 -0.704593 0.002910 -1.065658 D -1.056913 1.035113 0.074528 0.268183 1.790770 -0.591745 A 0.888811 1.267505 0.125988 -0.139170 0.800954 0.786291 C 0.660442 1.275167 1.053110 0.208797 1.212054 -0.751298
三.选择
获取(不太方便认为)
选择一列,返回Series,df[‘A’],同df.A只能访问一个,不能多个,也不能切片
In [73]: df['A'] Out[73]: 2017-07-21 0.888811 2017-07-22 1.267505 2017-07-23 0.125988 2017-07-24 -0.139170 2017-07-25 0.800954 2017-07-26 0.786291 Freq: D, Name: A, dtype: float64 In [74]: df.A
通过[ ]进行选择,行的切片
:可以是索引也可以是标号,但只是按行
通过索引标签的话,包括首位
但是通过数字标号的话,不包括尾,看例子。
df['20170722':'20170724'] Out[77]: A B C D 2017-07-22 1.267505 -0.044836 1.275167 1.035113 2017-07-23 0.125988 -1.829078 1.053110 0.074528 2017-07-24 -0.139170 -0.704593 0.208797 0.268183 df[0:3] Out[75]: A B C D 2017-07-21 0.888811 -0.039728 0.660442 -1.056913 2017-07-22 1.267505 -0.044836 1.275167 1.035113 2017-07-23 0.125988 -1.829078 1.053110 0.074528
通过标签选择(方便灵活多样推荐)
使用标签来获取一个交叉的区域(注意标签切片包括尾部,后面的数字切片不101cb
包括)
In [88]: dates Out[88]: DatetimeIndex(['2017-07-21', '2017-07-22', '2017-07-23', '2017-07-24', '2017-07-25', '2017-07-26'], dtype='datetime64[ns]', freq='D') In [89]: dates[0] Out[89]: Timestamp('2017-07-21 00:00:00', offset='D')
df.loc[dates[0]]同
df.loc['2017-07-21']
In [91]: df.loc[dates[0]] Out[91]: A 0.888811 B -0.039728 C 0.660442 D -1.056913 Name: 2017-07-21 00:00:00, dtype: float64
还可以类似numpy数组的方式切片,也可以单个,不同的是这个切片包括尾部
切片
a:b包括
b,不同的是
a b为索引标签,不是整数
In [97]: df.loc[:dates[1],['A','B']] Out[97]: A B 2017-07-21 0.888811 -0.039728 2017-07-22 1.267505 -0.044836 In [98]: df.loc[:'2017-07-24',['A','B']] Out[98]: A B 2017-07-21 0.888811 -0.039728 2017-07-22 1.267505 -0.044836 2017-07-23 0.125988 -1.829078 2017-07-24 -0.139170 -0.704593
还会进行自动维度缩减,但是还有name参数
In [110]: df.loc[dates[1],['A','B']] Out[110]: A 1.267505 B -0.044836 Name: 2017-07-22 00:00:00, dtype: float64
若获取某一个标量,有快速方法
df.at[dates[0],'A']#快速 df.loc[dates[0],'A']#两个返回内容等价
通过位置选择
通过数值选择行
In [111]: df.iloc[3]
通过整数的切片,也可以是列表,总之与numpy相同,切片一般不包括尾部
df.iloc[3:5,0:2] df.iloc[[1,2,4],[0,2]]
快速的访问标量方法
df.iat[1,1]
布尔索引
使用一列来选择数据df[df.A > 0]
对于所有的,则不满足的为NaN
In [114]: df[df > 0] Out[114]: A B C D 2017-07-21 0.888811 NaN 0.660442 NaN 2017-07-22 1.267505 NaN 1.275167 1.035113 2017-07-23 0.125988 NaN 1.053110 0.074528 2017-07-24 NaN NaN 0.208797 0.268183 2017-07-25 0.800954 0.00291 1.212054 1.790770 2017-07-26 0.786291 NaN NaN NaN
使用
isin()方法来过滤
先复制再添加一列
In [116]: df2 = df.copy() In [117]: df2['E'] = ['one', 'one','two','three','four','three'] In [118]: df2 Out[118]: A B C D E 2017-07-21 0.888811 -0.039728 0.660442 -1.056913 one 2017-07-22 1.267505 -0.044836 1.275167 1.035113 one 2017-07-23 0.125988 -1.829078 1.053110 0.074528 two 2017-07-24 -0.139170 -0.704593 0.208797 0.268183 three 2017-07-25 0.800954 0.002910 1.212054 1.790770 four 2017-07-26 0.786291 -1.065658 -0.751298 -0.591745 three
设置
设置一个新的列,自动排列日期索引s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
df['F'] = s1
通过标签更改某个值
df.at[dates[0],'A'] = 0 df.iat[0,1] = 0
获取行数
len()
len(df) Out[147]: 6
通过一个numpy数组设置一组新值
df.loc[:,'D'] = np.array([1,2,3,5,4,5]) df Out[149]: A B C D F 2017-07-21 0.888811 -0.039728 0.660442 1 NaN 2017-07-22 1.267505 -0.044836 1.275167 2 1.0 2017-07-23 0.125988 -1.829078 1.053110 3 2.0 2017-07-24 -0.139170 -0.704593 0.208797 5 3.0 2017-07-25 0.800954 0.002910 1.212054 4 4.0 2017-07-26 0.786291 -1.065658 -0.751298 5 5.0
通过where操作来设置新的值
df2 = df.copy() df2[df2 > 0] = -df2
四.缺失值处理
重新索引允许改变,增加,删除具体轴上的索引。返回原始数据的拷贝。缺失为NaN
In [169]: df1 = df.reindex(index=dates[0:5], columns=list(df.columns) + ['E']) In [170]: df1 Out[170]: A B C D F E 2017-07-21 0.888811 -0.039728 0.660442 1 NaN NaN 2017-07-22 1.267505 -0.044836 1.275167 2 1.0 NaN 2017-07-23 0.125988 -1.829078 1.053110 3 2.0 NaN 2017-07-24 -0.139170 -0.704593 0.208797 5 3.0 NaN 2017-07-25 0.800954 0.002910 1.212054 4 4.0 NaN
去掉包含Nan的行
df1.dropna(how='any')
填充所有的Nan
df1.fillna(value=5)
以布尔值填充
In [176]: pd.isnull(df1) Out[176]: A B C D F E 2017-07-21 False False False False True True 2017-07-22 False False False False False True 2017-07-23 False False False False False True 2017-07-24 False False False False False True 2017-07-25 False False False False False False
五.相关操作
统计
一般不包括NaN执行描述性统计,默认按0轴操作
In [178]: df.mean() Out[178]: A 0.621730 B -0.613497 C 0.609712 D 3.333333 F 3.000000 dtype: float64
在其他轴操作,按行求均值
In [179]: df.mean(1) Out[179]: 2017-07-21 0.627381 2017-07-22 1.099567 2017-07-23 0.870004 2017-07-24 1.473007 2017-07-25 2.003183 2017-07-26 1.793867 Freq: D, dtype: float64
对于一些算数操作,可以广播,如下,第0轴的减法。
df.sub(s, axis=0) Out[188]: A B C D F 2017-07-21 -0.111189 -1.039728 -0.339558 0.0 NaN 2017-07-22 -1.732495 -3.044836 -1.724833 -1.0 -2.0 2017-07-23 -4.874012 -6.829078 -3.946890 -2.0 -3.0 2017-07-24 NaN NaN NaN NaN NaN 2017-07-25 -5.199046 -5.997090 -4.787946 -2.0 -2.0 2017-07-26 -7.213709 -9.065658 -8.751298 -3.0 -3.0
Apply
直方图
字符串方法
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog','cat']) In [201]: s.str.lower() Out[201]: 0 a 1 b 2 c 3 aaba 4 baca 5 NaN 6 caba 7 dog 8 cat dtype: object
保存文件
df.to_csv('路径',encoding='gbk') df=pd.read_csv('路径',encoding='gbk')
相关文章推荐
- 十分钟学会pandas《10 Minutes to pandas》
- pandas官方网站上《10 Minutes to pandas》的简单翻译
- 10 Minutes to pandas
- 10 Minutes to pandas
- How to Setup a Private Proxy Server on EC2 in Under 10 Minutes
- How to Spend the First 10 Minutes of Your Day
- 10 minutes to run every Windows app on your Ubuntu desktop,10分钟在你的UBUNTU中运行WINDOWS应用程序
- 让你更爱自己的十大超级自我暗示(10 Powerful Self-affirmations to Love Yourself More)
- CSU-ACM2017暑期训练10-并查集&&HASH F - Flying to the Mars HDU - 1800(字符串hash)
- How to Start a Business in 10 Days
- leetcode之旅(10)-Roman to Integer
- Part 1 to 10 Basic in C#
- 10 Steps to Become an Outstanding Java Developer
- Oracle10_TO_Oracle11数据导入
- USB-to-serial 设备无法启动 代码(10)
- 拿不到博士学位的十个简单原因(10 easy ways to fail a Ph.D.)
- To_10_r_100_6---根据上排给出十个数,在其下排填出对应的十个数
- 0100 初级美语 Lesson 10:Responding to Requests 对要求作出反应
- 10个iOS类库使你事半功倍(10 iOS Libraries to Make Your Life Easier)
- Unity Xcode 8 iOS 10 出现警告 Libinfo call to mDNSResponder on main thread