pandas

三种数据结构

Series 带标签的一维:

DataFrame 带标签且大小可变的二维表格结构;

Panel带标签且大小可变的三维数组

 生成一维数组

import numpy as np
import pandas as pd
x = pd.Series([1, 3, 5, np.nan])
pd.Series(range(5))
pd.Series(range(5),index=list('abcde'))
pd.date_range(start='20180101',end='20181231',freq='H')
pd.date_range(start='20180101',end="20191231",freq="D")
pd.date_range(start='20180101',end="20181231",freq="M")
pd.date_range(start='20180101',end="20181231",freq="MS")
pd.date_range(start='202004090800',periods=5,freq='2H')

参数periods用来指定要生成的日期时间数据的数量。

pd.date_range(end='202004090800',periods=5,freq='2H')

二维数组DataFrame的操作

dates = pd.date_range(start='20180101',end="20181231",freq="M")
>>> pd.DataFrame(np.random.randn(12,4), index=dates,columns=list('ABCD'))
                   A         B         C         D
2018-01-31  1.430764 -0.570509  2.001759 -0.378457
2018-02-28  0.101779  1.760331 -0.593329  0.545458
2018-03-31  0.332762 -1.806258  0.959218 -0.746761
2018-04-30 -0.490047 -0.488414 -0.105263 -1.957838
2018-05-31 -0.661250  0.398992  0.505101  0.227674
2018-06-30  1.411308  0.354013  0.520608 -0.749293
2018-07-31  1.121131  0.520885 -1.427931  0.582491
2018-08-31 -0.055597 -1.716857  0.087238  1.226895
2018-09-30  0.705485 -2.075625  0.524160  0.211684
2018-10-31  0.052462  0.138969 -1.655494 -0.737842
2018-11-30  1.014822 -2.091701 -0.553490 -0.222810
2018-12-31 -0.457446 -0.213122  0.053456 -0.659432
>>># 可以不带后面的index和columns两个参数
>>> pd.DataFrame(np.random.randn(12,4))
           0         1         2         3
0   0.093899  1.174404 -0.278384  1.247693
1   0.796956 -0.821047 -1.689773  1.103342
2  -0.019589  1.795205  1.603527  1.443758
3  -1.526299  1.503343 -0.174814 -0.927228
4   1.825296  0.219742  0.714336 -2.137064
5   0.474488  1.153171  0.587585 -1.506265
6   0.914878 -0.937574 -0.261841 -0.302997
7  -1.551265 -0.726468 -1.278511  0.042968
8   1.108579 -0.445814 -0.143011 -0.599777
9   0.934322 -1.684607 -1.667692 -0.497206
10 -0.020138 -3.205168 -0.170677 -0.811614
11  0.791528 -0.483691  0.593668 -0.011199

查看二维数组数据

df.head()
df.head(3)
df.tail(2)

查看二维数组数据的 索引、列名和值

df.index
df.columns
df.values

查看二维数组数据的统计信息

df.describe()

对二维数组进行排序

df.sort_index(axis=0,ascending=False)#对索引进行降序排序
df.sort_index(axis=0,ascending=True)#对索引升序
df.sort_index(axis=1, ascending=False) #对列进行降序排序
df.sort_values(by='A')#按A列对数据进行升序排序
df.sort_value(by=['E','C'])
df['A']#选择某一列数据
60 in df['A']
60 in df['A'].values
df[0:2] #使用切片选择多行

df.loc[:,['A','c']] #选择多列 所有行
df.iloc[[0,2,3],[]0,4]#查询二维数组指定的多行、多列数据
df.iloc[0,1]
df.iloc[2,2]
df[df.A>50] #查询A列>50的所有行
df[df['E']=='test']查询E列为test的所有行
df[df['A'].isin([20,69])]#查询A列值为20或69的所有行
df.nlargest(3,['c'])

返回C列值最大的前3行

df.nlargest(3,['A']) #返回A列值最大的前三行
df.iat[0,2] = 3
df.loc[:,'D'] = np.random.randint(50,60,4)

df['C'] = -df['C']
df
from copy import deepcopy
dff = deepcopy(df)
dff['c'] = dff['C'] ** 2
dff
dff = df[:]
dff.loc[dff['c']==9.0,'D'] = 100
dff
#把C列值为9的数据行中的D列改为100
#把所有1替换为5
data = pd.DataFrame({'k1':['one']*3+['two']*4,'k2':[1,1,2,3,4,4]})
data.replace(1,5)
data.replace({1:5,'one':'ONE'})#使用字典指定替换关系
df1 = df.reindex(columns=list(df.columns)+['G'])#增加 一列,列明为G 
#修改指定位置元素 该列其他元素仍为缺失值
df1.iat[0,6] = 3


#返回不包含缺失值的行
df1.dopna()
#使用指定值原地填充缺失值
df1['G'].fillna[5,inplace=True]
data.drop_duplicates()#返回新数组 删除重复行
data.drop_duplicates(['K1'])#删除k1列重复数据
data.drop_duplicates(['k1'],keep='last')
#对于重复数据只保留最后一个

二维数组异常值处理。

import numpy as np
import pandas as pd
data = pd.DataFrame(np.random.randn(500,4))
data.describe()
col2 = data[2] #获取列下标为2的数据
col2[col2>3.5] #查询该列中大于3.5的数据
col2[col2>3.0]

data[np.abs(data)>2.5] = np.sign(data) * 2.5

二维数组的映射

data = pd.DataFrame({'k1':['one'] * 3+['two'] * 4,'k2':[1,2,3,4,4,4,4]})
data
#使用可调用对象进行映射
data['k1'] = data['k1'].map(str.upper)
#使用字典表示映射关系
data['k1'] = data['k1'].map({'ONE':'one','TWO':'two'})

二维数组数据离散化

from random import randrange
data = [randrange(100) for _ in range(10)]#生成随机数
catagory = [0,30,70,100]
pd.cut(data.category)
pd.cut(data,category,right=False)#左闭右开
labels = ['low','middle','high']
pd.cut(data,category,right=False,labels = labels)#指定标签
pd.cut(data,4)

移位与频次统计

df1.shift(1)#数据下移一行 -1上移
df1['D'].value_counts()#直方图统计
df1['G'].value_counts()#统计G列数据分布情况
df2 = pd.DataFrame(np.random.randn(10,4))
df2
p1 = df2[:3]#拆分得到前三行数据
p2 = df2[3:7]
p3 = df2[7:]
df3 = pd.concat([p1,p2,p3])

分组计算

分组汇总与统计是数据处理时常用的技术之一。

df.diff()纵向一阶差分
df.diff(axis=1) #横向一阶差分
df.diff(periods=2)#纵向二阶差分

读写文件

df.to_excel('d:\\test.xlsx',sheet_name='dfg')
df = pd.read_excel('d:\\test.xlsx','dfg',index_col=None,na_value=['NA'])

df.to_csv('d:\\test.csv')
df = pd.read_csv('d:\\test.csv')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(1000,2),columns=['B','C']).cumsum()
df['A'] = pd.Series(list(range(len(df))))
plt.figure()
df.plot(x='A')
plt.show()
df = pd.DataFrame(np.random.randon(10,4),columns=['a','b','c','d'])
df.plot(kind='barch',stacked=True)
plt.show()

使用pandas读取文件data.csv中的数据,创建DataFrame对象,并删除其中所有缺失值;

2)使用matplotlib生成折线图,反应该饭店每天的营业额情况,并把图形保存为本地文件first.jpg;

3)按月份进行统计,使用matplotlib绘制柱状图显示每个月份的营业额,并把图形保存为本地文件second.jpg;

4)按月份进行统计,找出相邻两个月最大涨幅,并把涨幅最大的月份写入maxMonth.txt;

5)按季度统计该饭店2017年的营业额数据,使用matplotlib生成饼状图显示2017年4个季度的营业额分布情况,并把图形保存为本地文件third.jpg。

import pandas as pd
import matplotlib.pyplot as plt
from copy import deepcopy

df = pd.read_csv('data.csv',encoding='cp936')
df = df.dropna()

#生成并保存营业额折线图
plt.figure()
df.plot(x='日期')
plt.savefig('first.jpg')

按月统计。生成并保存柱状图

plt.figure()
df1 = deepcopy(df)
df1['month'] = df1['日期'].map(lamada x: x[:x.rindex('-')])
df1 = df1.groupby(by='month',as_index=False).sum()
df1.plot(x='month',kind='bar')
plt.savefig('second.jpg')

查找涨幅最大的月份,写入文件

df2 = df1.drop('month',axis=1).diff()
m = df2['销量'].nlargest(1).keys()[0]
with open('maxMonth.txt','w') as fp:
     fp.write(df1.loc[m, 'month'])

按季度统计 生成并保存饼图

plt.figure()
one  = df1[:3] ['销量'].sum()
two = df1[3:6]['销量'].sum()
three = df1[6:9]['销量'].sum()
four = df1[9:12]['销量'].sum()
plt.pie([one,two.three,four],
labels=['one','two','three','four'])
plt.savefig('third.jpg')

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撸码的xiao摩羯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值