DA-002【总第8期】Python数据分析:pandas基本用法(下)
程序员文章站
2022-05-25 17:05:20
...
接着上一篇文章,本篇继续讨论pandas的一些用法和功能:
随机数生成:
s = pd.Series(np.random.randint(0,8,size=12))#生成12个0-7的随机整数
print(s)
统计每个数字出现的次数:
s.value_counts()#统计出现的频率
生成随机数表
df = pd.DataFrame(np.random.randn(10, 6))#10行6列的随机数表
一行的复制与插入:
df1 = pd.DataFrame(np.random.randn(10, 6),columns=['A','B','C','D','E','F'])#10行6列的随机数表,带有A-F的列标
s = df.iloc[1]
df.append(s, ignore_index=True)#将第二行插入最下方
我们复制了第二行,并将其添加到表格最下方一行,可以看到编号为1和10的数值相同:
数据的分组:
#分组:将数据分为不同的组独立应用函数,组合的结果为一个数据结构
df = pd.DataFrame({'gender' : ['man', 'woman', 'man', 'woman',
'woman', 'woman', 'man', 'woman'],
'class' : ['classone', 'classone', 'classtwo', 'classthree',
'classtwo', 'classtwo', 'classone', 'classthree'],
'id' : range(101,109),
'rand' : np.random.randn(8)})
print之后我们可以看到如下表格:
class | gender | id | rand | |
---|---|---|---|---|
0 | classone | man | 101 | -1.389698 |
1 | classone | woman | 102 | 0.145562 |
2 | classtwo | man | 103 | 0.620394 |
3 | classthree | woman | 104 | 0.269904 |
4 | classtwo | woman | 105 | -0.738634 |
5 | classtwo | woman | 106 | 0.290718 |
6 | classone | man | 107 | 1.295245 |
7 | classthree | woman | 108 | -1.988285 |
分组统计:
df.groupby('gender').sum()#应用函数统计总和存放到结果组
df.groupby(['gender','class']).sum()#按多列分组为层次索引,然后应用函数
分别的输出为:
如果不想加上id这一列,可以先drop掉
下面我们再来看一组数据:
df = pd.DataFrame({'Name' : ['Ben', 'Davy', 'Nick', 'Tim',
'Ted', 'Jack', 'Alice', 'Cindy','Leo','Porl','Hence','Susan'],
'country':['US','US','UK','CN']*3,
'group':['A','B','C']*4,
'id' : range(201,213),
'rand' : np.random.randn(12)})
df
数据相关关系分析:(按照group\country分类,方便我们更直观了解数据情况)
#生成数据透视表:
pd.pivot_table(df, values='rand', index=['country', 'Name'], columns=['group'])#排列行和列
输出如下:
简单的时间序列分析:(利用pandas中的常用函数date_range)
rng = pd.date_range('3/11/2018', periods=5, freq='D')
#函数原型:pd.date_range(start=None, end=None, periods=None, freq=’D’, tz=None, normalize=False, name=None, closed=None, **kwargs)
#start:string或datetime-like,默认值是None,表示日期的起点。
#end:string或datetime-like,默认值是None,表示日期的终点。
#periods:integer或None,默认值是None,表示你要从这个函数产生多少个日期索引值;如果是None的话,那么start和end必须不能为None。
#freq:string或DateOffset,默认值是’D’,表示以自然日为单位,这个参数用来指定计时单位,比如’5H’表示每隔5个小时计算一次。
#tz:string或None,表示时区,例如:’Asia/Hong_Kong’。
#normalize:bool,默认值为False,如果为True的话,那么在产生时间索引值之前会先把start和end都转化为当日的午夜0点。
#name:str,默认值为None,给返回的时间索引指定一个名字。
#closed:string或者None,默认值为None,表示start和end这个区间端点是否包含在区间内,可以有三个值,’left’表示左闭右开区间,’right’表示左开右闭区间,None表示两边都是闭区间
ts = pd.Series(np.random.randn(len(rng)), index=rng)
输出效果如下:
ts_utc = ts.tz_localize('UTC')
print(ts_utc)
此时是午夜零点,输出如下:
ts_utc = ts.tz_localize('US/Eastern')
print(ts_utc)
转换一下时区,输出如下:
试一下不同的时间跨度:
rng = pd.date_range('3/1/2018', periods=5, freq='M')#不同的时间跨度
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts
ps = ts.to_period()#以月份为时间段
print(ps)
pr=ps.to_timestamp()#从月份起始开始
print(pr)
#转换时间段并进行运算:下面是每年8月到季度结束每日上午9点的数据:
prng = pd.period_range('2013Q1', '2017Q4', freq='Q-AUG')
ts = pd.Series(np.random.randn(len(prng)), prng)
ts.index = (prng.asfreq('M', 'e') + 1).asfreq('H', 's') + 10
print(ts)
顺便介绍时间序列绘图的方法:
#绘图
%matplotlib inline
ts = pd.Series(np.random.randn(1000), index=pd.date_range('9/1/2015', periods=1000))
ts = ts.cumsum()#金融中每一点的值都是之前涨跌的累加
ts.plot()
效果如下:
df = pd.DataFrame(np.random.randn(1000,7), index=ts.index,columns=['A','B','C','D','E','F','G'])#绘制多条曲线
df = df.cumsum()
plt.legend(loc='upper left')
效果如下:
最后我们应该把这些处理过的数据写入文件:
格式如下:
#文件读写:
df.to_csv('data.csv')#将数据写入csv文件
pd.read_csv('foo.csv')#读取csv文件
df.to_hdf('data.h5','df')#将数据写入html5文件
pd.read_hdf('data.h5','df')#读取html5文件
df.to_excel('data.xlsx', sheet_name='Sheet1')#将数据写入excel文件
pd.read_excel('data.xlsx', 'Sheet1', index_col=None, na_values=['NA'])#读取excel文件