##pandas笔记1
#系列(Series)
#一维
#均匀数据,尺寸大小不变,数据的值可变
#数据帧(DataFrame)
#二维
#异构数据,大小可变,数据可变
#面板(Panel)
#三维
#异构数据,大小可变,数据可变
#这些数据结构构建在Numpy数组之上
import pandas as pd
import numpy as np
#创建一个默认的整数索引
s = pd.Series([1,3,5,np.nan,6,8])
print(s)
#输出
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
#通过传递numpy数组,使用datetime索引和标记列来创建DataFrame
dates = pd.date_range(‘20170101’, periods=7)
print(dates)
pandas.DataFrame( data, index, columns, dtype, copy)
#data:数据采取各种形式,如:ndarray,series,map,lists,dict,constant和另一个DataFrame
#index:对于行标签,要用于结果帧的索引是可选缺省值np.arrange(n),如果没有传递索引值
#columns:对于列标签,可选的默认语法是 - np.arange(n)。 这只有在没有索引传递的情况下才是这样
#dtype:每列的数据类型
#列删除
del df[‘one’]
df.pop(‘two’)
#增加行
df = df.append(df2)
#删除行
df = df.drop(0)
print("–"*16)
df = pd.DataFrame(np.random.randn(7,4), index=dates, columns=list(‘ABCD’))
print(df)
输出
DatetimeIndex([‘2017-01-01’, ‘2017-01-02’, ‘2017-01-03’, ‘2017-01-04’,‘2017-01-05’, ‘2017-01-06’, ‘2017-01-07’],dtype=‘datetime64[ns]’, freq=‘D’)
A B C D
2017-01-01 -0.732038 0.329773 -0.156383 0.270800
2017-01-02 0.750144 0.722037 -0.849848 -1.105319
2017-01-03 -0.786664 -0.204211 1.246395 0.292975
2017-01-04 -1.108991 2.228375 0.079700 -1.738507
2017-01-05 0.348526 -0.960212 0.190978 -2.223966
2017-01-06 -0.579689 -1.355910 0.095982 1.233833
2017-01-07 1.086872 0.664982 0.377787 1.012772
#通过传递可以转换为类似系列的对象的字典来创建DataFrame
df2 = pd.DataFrame({ ‘A’ : 1.,
‘B’ : pd.Timestamp(‘20170102’),
‘C’ : pd.Series(1,index=list(range(4)),dtype=‘float32’),
‘D’ : np.array([3] * 4,dtype=‘int32’),
‘E’ : pd.Categorical([“test”,“train”,“test”,“train”]),
‘F’ : ‘foo’ })
print(df2)
#输出
A B C D E F
0 1.0 2017-01-02 1.0 3 test foo
1 1.0 2017-01-02 1.0 3 train foo
2 1.0 2017-01-02 1.0 3 test foo
3 1.0 2017-01-02 1.0 3 train foo
#查看框架的顶部和底部的数据行
df.head()
df.tail()
#显示索引,列和底层numpy数据
df.index
df.columns
df.values
#显示描述数据的快速统计摘要
df.describe()
#按轴排序
df.sort_index(axis=1, ascending=False)
#按值排序
df.sort_values(by=‘B’)
#选择一列
df[‘A’]
#选择切片行
df[0:3]
df[‘20170102’:‘20170103’]
#使用标签获取横截面
df.loc[dates[0]]
#通过标签选择多轴
df.loc[:,[‘A’,‘B’]]
#标签切片
df.loc[‘20170102’:‘20170104’,[‘A’,‘B’]]
#获得标量值
df.loc[dates[0],‘A’]
#通过传递的整数的位置选择
df.iloc[3]
#通过整数切片
df.iloc[3:5,0:2]
#通过整数位置的列表
df.iloc[[1,2,4],[0,2]]
#明确获取值
df.iloc[1,1]
#使用单列的值来选择数据
df[df.A > 0]
#从满足布尔条件的DataFrame中选择值
df[df > 0]
#输出
A B C D
2017-01-01 NaN 1.963213 0.643244 0.945643
2017-01-02 0.364237 0.917368 NaN NaN
2017-01-03 0.702624 NaN 0.088565 NaN
2017-01-04 1.274313 NaN 2.313910 NaN
2017-01-05 2.586315 0.588273 NaN 1.482597
2017-01-06 NaN 0.405928 0.309201 NaN
#负值被转换成了NaN
#使用isin()方法进行过滤
dates = pd.date_range(‘20170101’, periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list(‘ABCD’))
df2 = df.copy()
df2[‘E’] = [‘one’, ‘one’,‘two’,‘three’,‘four’,‘three’]
print(df2)
print("============= start to filter =============== ")
print(df2[df2[‘E’].isin([‘two’,‘four’])])
#输出
A B C D E
2017-01-01 0.723399 -0.369247 0.863941 -1.910875 one
2017-01-02 -0.047573 -0.609780 2.130650 -0.019281 one
2017-01-03 -0.566122 -0.850374 -0.031516 0.362023 two
2017-01-04 0.903819 -0.513673 0.118850 -0.351811 three
2017-01-05 -0.485232 -0.864457 1.396835 -1.696083 four
2017-01-06 0.272145 -0.644449 -1.319063 -0.201354 three
============= start to filter ===============
A B C D E
2017-01-03 -0.566122 -0.850374 -0.031516 0.362023 two
2017-01-05 -0.485232 -0.864457 1.396835 -1.696083 four
#函数应用
#并不是所有的函数都可以向量化(也不是返回另一个数组的NumPy数组,也不是任何值),
#在DataFrame上的方法applymap()和类似于在Series上的map()接受任何Python函数,并且返回单个值
df = pd.DataFrame(np.random.randn(5,3),columns=[‘col1’,‘col2’,‘col3’])
#My custom function
df[‘col1’].map(lambda x:x*100)
print(df)
#输出
col1 col2 col3
0 0.629348 0.088467 -1.790702
1 -0.592595 0.184113 -1.524998
2 -0.419298 0.262369 -0.178849
3 -1.036930 1.103169 0.941882
4 -0.573333 -0.031056 0.315590
df = pd.DataFrame(np.random.randn(5,3),columns=[‘col1’,‘col2’,‘col3’])
df.applymap(lambda x:x*100)
print(df)
#输出
col1 col2 col3
0 17.670426 21.969052 -49.064031
1 22.237846 42.216693 195.392124
2 24.109576 -86.457646 69.643171
3 35.576312 -162.332803 -81.743023
4 30.874333 71.476717 13.028751