前言
由于工作的原因,现在使用R较少,使用Python的频率较高,将给大家分享在工作中用到python使用技巧和相关的代码。
安装Anaconda64, 推荐使用jupyter notebook或者Spyder来做数据分析和建模,开发建议使用Pycharm
1、安装pandas
win+R---->cmd , 或者从Anaconda Prompt启动安装
pip install pandas
2.pandas 加载命名
import pandas as pd
3.pandas一维操作
pd.Series( x, index=idx )
4.pandas 二维操作
pd.DataFrame( x, index=idx, columns=col )
index = ['A', 'B', 'C']
df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),columns=['a', 'b', 'c'],index=index)
#获取信息值
df2.values
#获取index
df2.index
#获取列名
df2.columns
#前几行,默认5行
df2.head()
#后几行,默认5行
df2.tail()
#获取行列信息
df2.shape
#基本描述性信息
df2.describe()
5.Panel三维操作
pd.Panel( x, item=itm, major_axis=n1, minor_axis=n2 )
不怎么用,感兴趣的可以研究一下。
6.数据表的存储和加载
(1)数据保存
data.to_excel('路径', index=False) ---保存为excel格式, index, 其他详细信息可以通过查看官网获取
data.to_csv('路径') ---保存为csv格式
data.to_sql('路径') ---保存为sql格式
data.to_hdf('路径') ---保存为hdf格式
(2)数据加载
data=read_excel('路径')
data=read_csv('路径')
data=read_sql('路径')
data=read_hdf('路径')
7.数据表的索引和切片
index = ['A', 'B', 'C']
df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),columns=['a', 'b', 'c'],index=index)
(1)获取第一列信息:df2.a 等价于df2['a'] 等价于df.iloc[:,0]等价于df2.loc[:,'a']
(2) 获取第一行信息:df2.iloc[0,:] ---备注:iloc第一个控制行,第二个数控制列,:表示全部行或者列
(3)获取多列信息(前两列):df2[['a', 'b']] 等价于df2.iloc[:,0:2] 等价于df2.loc[:,'a':'b'] ---python计数从0开始,所以0:2表示0,1
(4)获取固定条件的信息:df2.loc[df2.a>3,:] 等价于df2[df2.a>3] ---第一列大于3的所有信息
(5)调用函数:df2.loc[lambda x :x.a> x.a.mean(),:]等价于df2[lambda x :x.a> x.a.mean()] --- 第一列大于第一列均值的所有信息
(6)调用函数+多条件:df2.loc[lambda x :(x.a> x.a.min())&(x.b>1),:] ---a列大于其最小值同时b列大于1的所有信息
8.表关联
数据表可以按「键」合并,用 merge 函数;可以按「轴」来连接,用 concat 函数。
pd.merge( df1, df2, how=s, left_on=c1,right_on=c1 )
s=’left‘:左连接 (left join):合并之后显示 df1 的所有行
s='right':右连接 (right join):合并之后显示 df2 的所有行
s='outer':外连接 (outer join):合并 df1 和 df2 共有的所有行
s='inner':内连接 (inner join):合并所有行 (默认情况)
pd.concat(df1, df2,axis = 0 ,ignore_index=True)
9.重塑
它们只是改变数据表的布局和展示方式而已,stack和unstack可以实现互转
For example:
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
data=DataFrame(np.arange(6).reshape((2,3)),index=pd.Index(['street1','street2']),columns=pd.Index(['one','two','three']))
print(data)
print('-----------------------------------------\n')
data2=data.stack()
data3=data2.unstack()
print(data2)
print('-----------------------------------------\n')
print(data3)
print('-----------------------------------------\n')
data4=data.unstack()
print(data4)
10.分组 (grouping)
data.groupBy( label )
import pandas as pd
df = pd.read_excel("https://github.com/chris1610/pbpython/blob/master/data/sample-salesv3.xlsx?raw=True")
df["date"] = pd.to_datetime(df['date'])
df.head()
#我们统计'ext price'这个属性在每个月的累和(sum)值,resample 只有在index为date类型的时候才能用
df.set_index('date').resample('M')['ext price'].sum()
date
2014-01-31 185361.66
2014-02-28 146211.62
2014-03-31 203921.38
2014-04-30 174574.11
2014-05-31 165418.55
2014-06-30 174089.33
2014-07-31 191662.11
2014-08-31 153778.59
2014-09-30 168443.17
2014-10-31 171495.32
2014-11-30 119961.22
2014-12-31 163867.26
#我们想知道每个用户每个月的sum值,那么就需要一个groupby
df.set_index('date').groupby('name')['ext price'].resample('M').sum()
name date
Barton LLC 2014-01-31 6177.572014-02-28 12218.032014-03-31 3513.532014-04-30 11474.202014-05-31 10220.172014-06-30 10463.732014-07-31 6750.482014-08-31 17541.462014-09-30 14053.612014-10-31 9351.682014-11-30 4901.142014-12-31 2772.90
Cronin, Oberbrunner and Spencer 2014-01-31 1141.752014-02-28 13976.262014-03-31 11691.622014-04-30 3685.442014-05-31 6760.112014-06-30 5379.672014-07-31 6020.302014-08-31 5399.582014-09-30 12693.742014-10-31 9324.372014-11-30 6021.112014-12-31 7640.60
Frami, Hills and Schmidt 2014-01-31 5112.342014-02-28 4124.532014-03-31 10397.442014-04-30 5036.182014-05-31 4097.872014-06-30 13192.19...
#我们可以使用Grouper写得更加简洁:
df.groupby(['name', pd.Grouper(key='date', freq='M')])['ext price'].sum()
# 按照年度,且截止到12月最后一天统计ext price的sum值
#Grouper里的freq
可以方便的改成其他周期参数(resample也可以)
df.groupby(['name', pd.Grouper(key='date', freq='A-DEC')])['ext price'].sum()
name date
Barton LLC 2014-12-31 109438.50
Cronin, Oberbrunner and Spencer 2014-12-31 89734.55
Frami, Hills and Schmidt 2014-12-31 103569.59
Fritsch, Russel and Anderson 2014-12-31 112214.71
Halvorson, Crona and Champlin 2014-12-31 70004.36
Herman LLC 2014-12-31 82865.00
Jerde-Hilpert 2014-12-31 112591.43
Kassulke, Ondricka and Metz 2014-12-31 86451.07
Keeling LLC 2014-12-31 100934.30
Kiehn-Spinka 2014-12-31 99608.77
Koepp Ltd 2014-12-31 103660.54
Kuhn-Gusikowski 2014-12-31 91094.28
Kulas Inc 2014-12-31 137351.96
Pollich LLC 2014-12-31 87347.18
Purdy-Kunde 2014-12-31 77898.21
Sanford and Sons 2014-12-31 98822.98
Stokes LLC 2014-12-31 91535.92
Trantow-Barrows 2014-12-31 123381.38
White-Trantow 2014-12-31 135841.99
Will LLC 2014-12-31 104437.60
Name: ext price, dtype: float64
11.整合 (aggregating)
pandas引入了agg函数,它提供基于列的聚合操作。而groupby可以看做是基于行,或者说index的聚合操作。
df[["ext price", "quantity", "unit price"]].agg(['sum', 'mean'])
#针对不同的列使用不同的聚合函数:
df.agg({'ext price': ['sum', 'mean'], 'quantity': ['sum', 'mean'], 'unit price': ['mean']})
#自定义函数:
# 这里的x是sku对应的column
get_max = lambda x: x.value_counts(dropna=False).index[0]
df.agg({'ext price': ['sum', 'mean'], 'quantity': ['sum', 'mean'],'unit price': ['mean'],'sku': [get_max]})
12.apply函数
-
data.apply(np.mean):对DataFrame中的每一列应用函数np.mean
-
data.apply(np.max,axis=1):对DataFrame中的每一行应用函数np.max, axis=0作用于列
相关文章(重点收藏):快速入门pandas