pandas

numpy像序列,

pandas更像字典形式的numpy

import pandas as pd
一般搭配np一起练习
np.nan 什么都没有
s = pd.Series([1,3,6, np.nan, 44, 1])
print(s) : xxx dtype:float64

dates = pd.date_range('20160101', periodes = 6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=['a','b','c','d'])
会用dates来做行标
df1 = pd.DataFrame(np.arange(12).reshape((3,4)))
行标是默认的0,1,2,3,4.....

df2 = pd.DataFrame({ '用字典代替' })
df2.dtypes float64, float32, int32, category, object, datetime64等
df2.index

df2.describe() 显示数据各种属性,比如大小平均百分比分布等
df2.T 转置
df.sort_index(axis=1, asending=False) 按index索引标进行排序, 对列的名称排序, 以倒序排列

df2.sort_values(by='E') 按单行的值进行排序

pandas数据选择....................................................................................


index是行标
columns 是列表

DataFrame({}) 字典导入, 字典关键字是列标

dates = pd.date_range('20130101', periods=6, freq='M') M按月,D按日

 

 

dates = pd.date_range('20130101', periods=6)
df = pd.DateFrame(np.arange(24).reshape((6,4)), index=dates, columns=['A','B','C','D'])

df['A']
df.A 和上面一样的效果 选A列
df[0:3]
df['20130102':'20130104'] 和上面一样, 按行标和按顺序
#select by label: loc
df.loc['20130102'] 以标签名选
df.loc[ : , ['A','B']) 选A,B行的数据
df.loc[ '20130102' , ['A','B']) 选A,B行 '20130102下的的数据

#select by position: iloc
df.iloc[3] 第3行的数据
df.iloc[3,1] 第3行第1位的数据
df.iloc[3:5, 1:3] 第3行到5行, 1列到3列的数据
df.iloc[[1,4,5],1:3] 第1,4,5个位置

#mixed selection: ix (位置和标签混合)
df.ix[:3, ['A','C']] 0到3行,A,C列

Boolean indexing: 是或者否的筛选
df[df.A>8] A列大于8的部分


pandas 赋值................................................................................................................
dates = pd.date_range('20130101', periods=6)
df = pd.DateFrame(np.arange(24).reshape((6,4)), index=dates, columns=['A','B','C','D'])

df.iloc[2,2] = 111 给2行2列的值赋值
df.loc['20130101', 'B'] = 222
df.ix [ '20130101', 2] = 333
df[df.A>0] = 0 A大于0的全部改为0
df.A[df.A>4] = 0 A大于0的A列全部改为0
df['F'] = np.nan F列全等于N#A
df['E'] = pd.Series([1,2,3,4,5,6], index = pd.date_range('20130101',periods=6))


pandas处理数据丢失...................................................................................................
dates = pd.date_range('20130101', periods=6)
df = pd.DateFrame(np.arange(24).reshape((6,4)), index=dates, columns=['A','B','C','D'])

虚拟丢失数据:
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan

df.dropna(axis=0, how='any')) #任何一个是non才会丢, how={'any','all'} #all全部是non才丢
掉这行. axis=1 丢掉列
df.fillna(value=0) non的值全部设置成0.
df.isnull() 检查全部位置是否位Non,
np.any(df.isnull())==True) 里头只要有一个丢失就是true


pandas 导入导出...............................................................................................................
read_csv, read_excel, read_pickle , .......
to_csv, .........


data = pd.read_csv('student.csv')
参数: sep 分割符(当txt的时候比如分割用逗号 , read_csv可以读txt


data.to_pickle('student.pickle')

pandas合并Series.......................................................................................................................
contatenating
axis=1左右合并 (axis=0上下合并)

df1 = pd.DateFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
df2 = pd.DateFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
df3 = pd.DateFrame(np.ones((3,4))*2, columns=['a','b','c','d'])

res = pd.concat([df1, df2, df3], axis=0) 竖向合并, axis=1横向合并 , 合并后行标不变, 比如0,1,2,0,1,2,0,1,2
res = pd.concat([df1, df2, df3], axis=0, ignore_index=True) 合并后行标重新设置,忽略原来的

#join, ['inner', 'outer']
df1 = pd.DateFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])
df2 = pd.DateFrame(np.ones((3,4))*1, columns=['b','c','d','e'], index=[2,3,4])
行和列部分重合

res = pd.concat([df1, df2]) 互相补全, 没有的部分用non填充(df2没有a列,全non).这是默认的outer
res = pd.concat([df1, df2], join='outer') 同上
res = pd.concat([df1, df2], join='inner') 裁剪, 都有的列部分, 不裁剪行,只裁剪列.
res = pd.concat([df1, df2], join='inner', ignore_index=True) 重新设置行号

res = pd.concat([df1,df2], axis=1) axis=1左右合并 (axis=0上下合并)
左右合并, 全部考虑,行号全加上. 没有的行的用Non

res = pd.concat([df1,df2], axis=1, join_axes=[df1.index]) axis=1左右合并 (axis=0上下合并)
左右合并,
给定index后(join_axes=[df1.index]),以给定的index合并.


append -----------------------------
res = df1.append(df2, ignore_index=True) 把2组数据附加到1上
res = df1.append([df2,df3], ignore_index=True) 加多个.
res = df1.append([df2,df3]) index不处理.

s1 = pd.Series([1,2,3,4], index=['a','b','c','d'])
后续有数据s1不停的添加到df1, series是子集.
res = df1.append(s1, ignore_index=True)

pandas合并DataFrame ................................................................................
1个key合并, '可能用在数据库.
left = pd.DataFrame(
{'key':[k0,k1,k2,k3],
'A':[A0,A1,A2,A3],
'B':[B0,B1,B2,B3]}
)
right = pd.DataFrame(
{'key':[k0,k1,k2,k3],
'C':[C0,C1,C2,C3],
'D':[D0,D1,D2,D3]}
)

res = pd.merge(left, right, on='key') 以key column合并, 同个key值在同一行.
以上可能用在数据库.

left = pd.DataFrame(
{'key1':[k0,k1,k2,k3],
'key2':[k0,k1,k2,k3],
'B':[B0,B1,B2,B3]}
)
right = pd.DataFrame(
{'key':[k0,k1,k2,k3],
'key2':[k0,k1,k2,C3],
'D':[D0,D1,D2,D3]}
)

res = pd.merge(left, right, on=['key1', 'key2']) 默认的是inner, 相同的部分合并.同时满足key1, key2相等(2个条件), 同时有多个条件符合, 缺失的部分复制顺推 how='inner'
how=['left','right','inner','outer']
outer: 不管是否一样都复制合并, 缺失的部分位Non
left, right: 左边合并或者右边合并. 缺失的有数据的顺带复制,没有的位Non

indicator, give the indicator a custom name ,显示合并的方式 left_only, both, right_only
indicator=True 默认_merge / indicator= 'Indicator Column' 列标直接指定


pandas 可视化matplotlib...............................................................................................................
import matplotlib.pyplot as plt
data = pd.Series(np.random.randn(1000),index=np.arange(1000))
data = data.cumsum() #进行累加
data.plot()
plt.plot(x=, y= , ) 一般设置,这里不用因为已经默认有了pandas
plt.show()

data = pd.DataFrame(np.random.randn(1000,4), index=np.arange(1000), columns=list('abcd'))
data.head(5) 前5个数据先看看.
data = data.cumsum()
data.plot()
plt.show()

或者
plot methods:
bar 条形图
hist
box
kde
area
scatter 散点分布图
hexbin
pie
...
...

aix = data.plot.scatter(x='A',y='B', color='DarkBlue', label='Class1')
data.plot.scatter(x='A',y='C',color='DarkGreen',label='Class2', ax=aix)

 

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

import pandas as pd

file = pd.read_csv('NIN411PF.CSV', encoding='ANSI')
title = file.columns
print(title)

 

posted @ 2019-02-19 07:47  CrossPython  阅读(290)  评论(0编辑  收藏  举报