欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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)

DA-002【总第8期】Python数据分析:pandas基本用法(下)

统计每个数字出现的次数:

s.value_counts()#统计出现的频率

DA-002【总第8期】Python数据分析:pandas基本用法(下)

生成随机数表

df = pd.DataFrame(np.random.randn(10, 6))#10行6列的随机数表

DA-002【总第8期】Python数据分析:pandas基本用法(下)

一行的复制与插入:

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的数值相同:

DA-002【总第8期】Python数据分析:pandas基本用法(下)

数据的分组:

#分组:将数据分为不同的组独立应用函数,组合的结果为一个数据结构
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()#按多列分组为层次索引,然后应用函数

分别的输出为:

DA-002【总第8期】Python数据分析:pandas基本用法(下)     DA-002【总第8期】Python数据分析:pandas基本用法(下)

如果不想加上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

DA-002【总第8期】Python数据分析:pandas基本用法(下)

数据相关关系分析:(按照group\country分类,方便我们更直观了解数据情况)

#生成数据透视表:
pd.pivot_table(df, values='rand', index=['country', 'Name'], columns=['group'])#排列行和列

输出如下:

DA-002【总第8期】Python数据分析:pandas基本用法(下)

简单的时间序列分析:(利用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)

输出效果如下:

DA-002【总第8期】Python数据分析:pandas基本用法(下)

ts_utc = ts.tz_localize('UTC')
print(ts_utc)

此时是午夜零点,输出如下:

DA-002【总第8期】Python数据分析:pandas基本用法(下)

ts_utc = ts.tz_localize('US/Eastern')
print(ts_utc)

转换一下时区,输出如下:

DA-002【总第8期】Python数据分析:pandas基本用法(下)

试一下不同的时间跨度:

rng = pd.date_range('3/1/2018', periods=5, freq='M')#不同的时间跨度
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts

DA-002【总第8期】Python数据分析:pandas基本用法(下)

ps = ts.to_period()#以月份为时间段
print(ps)

DA-002【总第8期】Python数据分析:pandas基本用法(下)

pr=ps.to_timestamp()#从月份起始开始
print(pr)

DA-002【总第8期】Python数据分析:pandas基本用法(下)

#转换时间段并进行运算:下面是每年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)

DA-002【总第8期】Python数据分析:pandas基本用法(下)

顺便介绍时间序列绘图的方法:

#绘图
%matplotlib inline
ts = pd.Series(np.random.randn(1000), index=pd.date_range('9/1/2015', periods=1000))
ts = ts.cumsum()#金融中每一点的值都是之前涨跌的累加
ts.plot()

效果如下:

DA-002【总第8期】Python数据分析:pandas基本用法(下)

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')

效果如下:

DA-002【总第8期】Python数据分析:pandas基本用法(下)


最后我们应该把这些处理过的数据写入文件:

格式如下:

#文件读写:
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文件


相关标签: DA