索引
1.行索引
#看一个一维数组的索引
s=pd.Series(np.random.randn(5),index=list('abcde'))
s
s.index#Series的索引
s.index.name='zrx'#给索引赋一个名字
#查询pandas里预置的索引的类
pd.*index?
2.重复索引
#重复索引
s=pd.Series(np.arange(6),index=list('abcabe'))
s
s['a']
out[10]:
a 0
a 3
dtype: int32
s.index.is_unique#判断索引里面有无重复的
s.groupby(s.index).sum()#处理重复索引,把重复索引求和
s.groupby(s.index).mean()#处理重复索引,把重复索引求平均
s.groupby(s.index).first()#处理重复索引,把重复索引只取第一项
3.层次化索引
可以使数据在一个轴上有多个索引级别。即可以用二维的数据表达更高维度的数据,使数据组织方式更清晰。它使用 pd.MultiIndex 类来表示。
比如我们在分析股票数据,我们的一级行索引可以是日期;二级行索引可以是股票代码,列索引可以是股票的交易量,开盘价,收盘价等等。这样我们就可以把多个股票放在同一个时间维度下进行考察和分析。
#多级索引pd.MultiIndex
a = [['a', 'a', 'a', 'b', 'b', 'c', 'c'], [1, 2, 3, 1, 2, 2, 3]]
tuples = list(zip(*a))#把两个列表组装成一个,列表里的元素是元组
tuples
index=pd.MultiIndex.from_tuples(tuples,names=['level1','level2'])
index
s=pd.Series(np.random.randn(7),index=index)
s
#选取一级索引
s['b']
s['b',2]
dataframe 多层索引
df = pd.DataFrame(np.random.randint(1, 10, (4, 3)), #选取1-10之间随机数,四行三列
index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns=[['one', 'one', 'two'], ['blue', 'red', 'blue']])
df
df.index.names = ['row-1', 'row-2']
df.columns.names = ['col-1', 'col-2']
交换索引
df2 = df.swaplevel('row-1', 'row-2')#交换索引
df2
df.sum(level=0)#根据第一级索引求和
df.sum(level=1)#根据第二级索引求和
索引列的转换
df = pd.DataFrame({
'a': range(7),
'b': range(7, 0, -1),
'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'],
'd': [0, 1, 2, 0, 1, 2, 3]
})
df
df.set_index('c')#把c这一列当作索引值
df2 = df.set_index(['c', 'd'])#把c,d都设置为索引值
df2
df3 = df2.reset_index().sort_index('columns')#转换回来换成一个平面的dataframne
df3
分组计算
分组运算计算三步: 拆分->应用->合并
拆分:根据什么分组(按照键值(key)或者分组变量将数据分组。)
应用:每个分组进行什么样的运算(对于每组应用我们的函数,这一步非常灵活,可以是python自带函数,可以是我们自己编写的函数。
)
合并:把每个分组的运算合并起来(将函数计算后的结果聚合。)
核心:
1.不论分组键是数组、列表、字典、Series、函数,只要其与待分组变量的轴长度一致都可以传入groupby进行分组。
2.默认axis=0按行分组,可指定axis=1对列分组。
1. 对Series进行分组
import pandas as pd
import numpy as np
df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],
'key2': ['one', 'two', 'one', 'two', 'one'],
'data1': np.random.randint(1, 10, 5),
'data2': np.random.randint(1, 10, 5)})
df
grouped = df['data1'].groupby(df['key1'])#用key1进行分组
grouped
实际上,在这一步,我们并没有进行任何计算仅仅是创建用key1分组后创建了一个groupby对象,我们后面函数的任何操作都是基于这个对象的。
grouped = df['data1'].groupby(df['key1']).mean()#用key1分组计算data1平均值
grouped
语法很简单,但是这里需要注意grouped的数据类型,它不再是一个数据框,而是一个groupby对象
df['data1'].groupby([df['key1'], df['key2']]).mean() #创建有多层索引的
2. 对DataFrame进行分组
#对dtaframe进行分组
df.groupby('key1').mean()
means = df.groupby(['key1', 'key2']).mean()['data1']
means
通过unstack方法进行结果重塑:
means.unstack()#生成的就是一个dataframe
对分组进行迭代
GroupBy对象支持迭代操作,会产生一个由分组变量名和数据块组成的二元元组:
for name, group in df.groupby('key1'):#支持python迭代器协议
#name分组的名字,group是是分组的数据
print (name)
print (group)
list(df.groupby(['key1','key2']))#转化成list
3.通过字典进行分组
#通过字典分组
df = pd.DataFrame(np.random.randint(1, 10, (5, 5)),
columns=['a', 'b', 'c', 'd', 'e'],
index=['zrx', 'dbw', 'lemon', 'mg', 'hzg'])
df
df.loc[ 1:3] = np.NaN #弄掉其中两行数据
df
想按列进行聚合
我们根据实际情况,对列名建立字典,然后将此字典传入groupby,切记指定axis=1,因为我们是对列进行分组聚合:
mapping = {'a': 'apple', 'b': 'banana', 'c': 'candy', 'd': 'apple', 'e': 'banana'}#对列名建立字典,列名进行分组
grouped = df.groupby(mapping, axis=1) #然后将此字典传入groupby
grouped.sum()
grouped.size() #每个有几列
4.通过函数进行分组
df = pd.DataFrame(np.random.randint(1, 10, (5, 5)),
columns=['a', 'b', 'c', 'd', 'e'],
index=['zrx', 'dbw', 'lemon', 'mg', 'hzg'])
def _dummy_group(idx):
print (idx)
return (idx)#返回索引的值
df.groupby(_dummy_group)#按行分组,所以每一行索引不一样
def _dummy_group(idx):
print (idx)
return (len(idx))
df.groupby(_dummy_group).size()#分组的name的长度
5.根据索引级别分组
刚刚我们的数据索引只有一级,当数据有多级索引时,可以通过level指定我们想要分组的索引,注意要使用axis=1表示按列:
#多级索引进行分组
columns = pd.MultiIndex.from_arrays([['rx', 'rx', 'rx', 'bw', 'bw'],['t-shirt', 'skirt', 'dress', 'shoes', 'underwear']], names=['name', 'type'])
df = pd.DataFrame(np.random.randint(1, 10, (5,5)), columns=columns)
df
我们名字进行分组求和:
df.groupby(level='name', axis=1).sum()
ps:转自CSDN博主:zrx1236