1 字段转series
import pandas as pd
series=pd.Series({'a':1,'b':2,'c':3})
这样用字典方式构建了Series数据类型,为了将索引‘abc’提取出来并形成三维的列表,采用这种方式:
ix=list(series.index)
index方法获得index对象,可以直接用list函数转换为列表
print(ix)
可以获得结果:
['a', 'b', 'c']
2 去重、删除行、列
import pandas as pd
filepath="C:/Users/yangge/Desktop/故障预测/设备资源环境数据2.xlsx"
df = pd.read_excel(filepath)#,low_memory=False
didDR=df.drop_duplicates(subset=['did'],keep='first',inplace=False)
didList=list(didDR['did'])
#subset对应的值是列名,表示只考虑这两列,将这两列对应值相同的行进行去重。默认值为subset=None表示考虑所有列。
#keep='first'表示保留第一次出现的重复行,是默认值。keep另外两个取值为"last"和False,分别表示保留最后一次出现的重复行和去除所有重复行。
#inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本。
df.drop('indexNum',inplace=True)#删除行
df.drop('key1',axis=1,inplace=True)#删除列
3 条件匹配
data=df.loc[df['did']==didList[i],['did','ts','cpu','mem','mac','arp']]#单条件
nowDayData=df.loc[(df['ts']<nowDayEndTs)&(df['ts']>=nowDayStartTs),['ts','cpu']]#双条件
4 重置index
df1 = df1.reset_index(drop=True)#重置index
5 dataframe合并
data=pd.concat((data,dataPart))
6 排序
# /usr/bin/python
# -*- coding: utf-8 -*-
# 导入依赖包pandas
import pandas as pd
# 读入数据
dat = pd.read_csv('data.txt', 'r')
# 单列排序
# 使用sort,默认是升序,所以下面的两个方法等价
dat.sort(["column1"])
dat.sort(["column1"], ascending=True)
# 单列降序
dat.sort(["column1"], ascending=False)
# 多列升序
dat.sort(["column1", "column2"])
dat.sort(["column1", "column2"], ascending=True)
# 多列降序
dat.sort(["column1", "column2"], ascending=False)
7 按指定字符分割字段
data["dH"],data['a'],data['b'],data['c']=data["ts"].str.split(':').str
8 替换
#方式1
df.sex[df['sex']=='f']=0
#方式2
df.loc[df['sex']=='f',['sex']]=0#单条件
df.loc[(df['sex']=='f')&(df['age']<20),['sex']]=0#多条件
9 分组查询groupby
(1)按列分组
group1 = df.groupby('key1')#按单列分组
group2 = df.groupby(['key1','key2'])#按多列分组
group2
#[Out]# <pandas.core.groupby.DataFrameGroupBy object at 0x0000000009CB4128>
(2)显示分组内容
[x for x in group1]
#[Out]# [('a', data1 data2 key1 key2
#[Out]# 0 0.439801 1.582861 a one
#[Out]# 1 -1.388267 -0.603653 a two
#[Out]# 4 2.169966 0.074715 a one),
#[Out]# ('b', data1 data2 key1 key2
#[Out]# 2 -0.514400 -0.826736 b one
#[Out]# 3 -1.487224 -0.192404 b two)]
(3)分组统计
在分组group1、group2上应用size()、sum()、count()等统计函数,能分别统计分组数量、不同列的分组和、不同列的分组数量。
group1.size()
#[Out]# key1
#[Out]# a 3
#[Out]# b 2
#[Out]# dtype: int64
group1.sum()
#[Out]# data1 data2
#[Out]# key1
#[Out]# a 1.221499 1.053922
#[Out]# b -2.001624 -1.019140
group2.size()
#[Out]# key1 key2
#[Out]# a one 2
#[Out]# two 1
#[Out]# b one 1
#[Out]# two 1
#[Out]# dtype: int64
group2.count()
#[Out]# data1 data2
#[Out]# key1 key2
#[Out]# a one 2 2
#[Out]# two 1 1
#[Out]# b one 1 1
#[Out]# two 1 1
(3)应用agg()
对于分组的某一列或者多个列,应用agg(func)可以对分组后的数据应用func函数。例如:用group1['data1'].agg('mean')对分组后的’data1’列求均值。当然也可以推广到同时作用于多个列和使用多个函数上。
group1['data1'].agg('mean')
#[Out]# key1
#[Out]# a 0.407166
#[Out]# b -1.000812
#[Out]# Name: data1, dtype: float64
group1['data1'].agg(['mean','sum'])
#[Out]# mean sum
#[Out]# key1
#[Out]# a 0.407166 1.221499
#[Out]# b -1.000812 -2.001624
group1['data1','data2'].agg(['mean','sum'])
#[Out]# data1 data2
#[Out]# mean sum mean sum
#[Out]# key1
#[Out]# a 0.407166 1.221499 0.351307 1.053922
#[Out]# b -1.000812 -2.001624 -0.509570 -1.019140
(4)应用apply()
apply()不同于agg()的地方在于:前者应用于dataframe的各个列,后者仅作用于指定的列。
df.groupby('key1').apply(mean)
#[Out]# data1 data2
#[Out]# key1
#[Out]# a 0.407166 0.351307
#[Out]# b -1.000812 -0.509570
df.groupby(['key1','key2']).apply(mean)
#[Out]# data1 data2
#[Out]# key1 key2
#[Out]# a one 1.304883 0.828788
#[Out]# two -1.388267 -0.603653
#[Out]# b one -0.514400 -0.826736
#[Out]# two -1.487224 -0.192404
10 透视表pivot_table
可以产生类似于excel数据透视表的结果,相当的直观。
1)分组统计
其中参数index指定“行”键,columns指定“列”键,根据values统计,不设aggfunc默认平均值,要求和用aggfunc='np.sum',计数用aggfunc=len,一起弄用aggfunc=[np.sum,len]
pd.pivot_table(df, index='key1', columns='key2',values='key3',aggfunc=len)
行索引为‘产地’,列索引为‘类别’,对‘价格’应用‘max’函数,并提供分项统计,缺失值填充0
df.pivot_table('价格',index='产地',columns='类别',aggfunc='max',margins=True,fill_value=0)
2)分项汇总
如果将参数margins设置为True,则可以得到分项总计数据。
df.pivot_table(index='key1',columns='key2', margins=True)
#[Out]# data1 data2
#[Out]# key2 one two All one two All
#[Out]# key1
#[Out]# a 1.304883 -1.388267 0.407166 0.828788 -0.603653 0.351307
#[Out]# b -0.514400 -1.487224 -1.000812 -0.826736 -0.192404 -0.509570
#[Out]# All 0.698455 -1.437746 -0.156025 0.276947 -0.398029 0.006956
11 交叉表crosstab
交叉表是用于统计分组频率的特殊透视表
pd.crosstab(df.key1,df.key2, margins=True)
#[Out]# key2 one two All
#[Out]# key1
#[Out]# a 2 1 3
#[Out]# b 1 1 2
#[Out]# All 3 2 5
12 修改列名
使用df.rename(), 注意如果df中有多个old_name列的话都会被一并重命名为new_name
df=df.rename(columns = {'old_name':'new_name'})
13 改index
把某列设为index,原index会被删除
#方式1
dataDf= dataDf.set_index('column_name')
#方式2
dataDf.index= dataDf['column_name']
#方式3,以0开始的递增整数列,原index会变成一个新的列
dataDf = dataDf.reset_index()
#如果不需要原来的index中的值可以加drop = True
dataDf = dataDf.reset_index(drop = True)
14 筛选多个列
required_key = ['User_ID','SEO visits','SEA visits','Conversion Rate']
dataDf = dataDf[dataDf['METRIC_KEY'].isin(required_key)]
https://www.bbsmax.com/A/QW5YWa7qzm/ Pandas数据特征分析
https://blog.csdn.net/qq_22073849/article/details/62888262 利用Pandas进行数据分析(3)——统计、处理缺失值、层次化索引