pandas 小介
Posted ting-light
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas 小介相关的知识,希望对你有一定的参考价值。
参考文档 http://pandas.pydata.org/pandas-docs/version/0.20/
pandas的功能非常强大,支持类似与sql的数据增、删、查、改,并且带有丰富的数据处理函数;
支持时间序列分析功能;支持灵活处理缺失数据等。
pandas的基本数据结构是Series和DataFrame。
Series是序列,类似一维数组;DataFrame相当于一张二维表格,类似二维数组,它的每一列都是
一个Series。 为了定位Series中的元素,Pandas提供了Index对象,每个Series都会带有一个对应的
Index,用来标记不同的元素,Index的内容不一定是数字,也可以是字母、中文等,它类似于sql中的
主键。
DataFrame相当于多个带有同样Index的Series的组合(本质是Series的容器),每个Series都带
有唯一的表头,用来标识不同的Series。
>>> import pandas as pd
>>> s=pd.Series([1,2,3],index=[‘a‘,‘b‘,‘c‘])
>>> s
a 1
b 2
c 3
>>> d=pd.DataFrame([[1,2,3],[4,5,6]],columns=[‘a‘,‘b‘,‘c‘])
>>> d.head()
a b c
0 1 2 3
1 4 5 6
>>> d.describe()
a b c
count 2.00000 2.00000 2.00000
mean 2.50000 3.50000 4.50000
std 2.12132 2.12132 2.12132
min 1.00000 2.00000 3.00000
25% 1.75000 2.75000 3.75000
50% 2.50000 3.50000 4.50000
75% 3.25000 4.25000 5.25000
max 4.00000 5.00000 6.00000
>>> pd.read_excel(‘C:\UserssomeoneDesktopdata.xlsx‘,‘Sheet1‘)
id int no 4 5 6 7 8
0 elec_code varchar no 50 电子表码 varchar no 100
1 user_id varchar no 50 用户编号 varchar no 100
2 user_name varchar no 50 用户名称 varchar no 100
写入excel
with pd.ExcelWriter(‘shanghai_%d.xlsx‘%iii) as writer:
for i,j in dddit:
j.to_excel(writer,sheet_name=str(i))
#j 为DataFrame类型数据
定位dataframe中元素
d=pd.DataFrame([[1,2,3],[4,5,6]],columns=[‘a‘,‘b‘,‘c‘])
定位行的数据 建议用 d.loc[1:2],与列表切片不同的是,这个会返回第一行和第二行的数据
定位列的数据 d[‘a‘,‘b‘]
删除 B列的数据 del d[‘b‘]
取某个数据 d.loc[1:2,[‘b‘,‘c‘]] 取索引为1,列号为‘b‘,‘c‘的数据
d.iloc[1:2,[1,2]] 根具数据的序号,取数据,而不是索引的值
d.index 返回索引明细
d.dtypes 返回各列(column)的类型及名称
填充空值
d=d.fillna(‘_‘)将NA以‘_‘值替换
合并DataFrame
merge 原理像sql 的两表关联 join
pd1=pd.DataFrame(list1,columns=[‘userid‘,])
pd2=pd.DataFrame(list2,columns=[‘r‘,‘userid2‘,‘filialename‘,‘username‘,‘useraddress‘,])
pd3=pd.merge(pd1,pd2,how=‘left‘,left_on=‘userid‘,right_on=‘userid2‘)
how,连接方式‘left‘,‘right‘,‘inner‘
使用左边的userid列和右边的userid2列作为连接键即userid=userid2
想根据某列的不同的值,创建出另一对应值的列,可用merge方法,连接两个df
concat 直接拼接合并
dfs=[pd1,pd2,pd3]
datas=pd.concat(dfs,axis=1)
axis为1时,横向连接 datas.columns 为 [‘userid‘,‘r‘,‘userid2‘,‘filialename‘,‘username‘,‘useraddress‘,‘userid‘,‘r‘,‘userid2‘,‘filialename‘,‘username‘,‘useraddress‘,]
axis为0时,纵向连接 相当于union all
根据某列的值排序
df.sort_values(by=[‘counts‘])
获得某列值出现的频率数
s=datas[‘filialename‘]
s.value_counts()
groupby,分组
类似sql的group by ,可以根据多个字段group by ,用列表
grouped=data.groupby(‘Fmfiliale‘)
#默认是 axis=0,即纵向分组
print(grouped.groups)
#结果如下:
#{‘118.190.41.176:water‘: Int64Index([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
# 17, 18, 19, 20, 21, 22, 23, 24],
# dtype=‘int64‘),
# ‘120.237.48.43:water‘: Int64Index([25], dtype=‘int64‘),
# ‘222.245.76.42:water‘: Int64Index([26, 27, 28, 29], dtype=‘int64‘)}
for name,group in grouped:
print(name,grouped)
返回的是(str,pd)类型数据,上例中的name值为改组的Fmfiliale值。
对于空值(#NA)groupby会自动排除这一条数据
以上是关于pandas 小介的主要内容,如果未能解决你的问题,请参考以下文章