groupby
这个函数的输入一般为dataframe的某一列,输出为以输入列属性值作为index的其余列的统计量。用于和多种函数连用,进而表示一些统计量,如果直接输出groupby的结果,输出:
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000016E4D3D4E48>
我们在这里需要将value_counts
是统计每列有多少个不同值,并计算每个不同值有在该列中有多少重复值,输出仍然为dataframe类型,不同值作为index,列名与输入值相同,内容是不同列出现的不同值的重复次数。下图上半部分的是value_counts
的结果,下部分是groupby.count()
的结果
num = df['司机'].value_counts()
print(num)
num = df.groupby(['司机']).count()
print(num)
"""df_driver = pd.DataFrame({'driver':num[0],'num':num[1]})
print(df_driver)"""
num.plot(kind = 'box')
常用的函数
常用的用一下四种,作用分别是:统计同行的可以求和的总和,统计同行的平均值,统计这一种属性出现的次数(NaN也包含在内),统计这一种属性出现的次数(NaN不包含在内)
import pandas as pd
column_1 = [1,2,3,9,None]
column_2 = ['hunan','hubei','beijing','hunan','beijing']
column_3 = ['wzy','hmz','wjc','cxy','zyy']
df = pd.DataFrame({'省份' : column_2, '人数' : column_1,'name':column_3})
print(df.groupby('省份').sum())
print(df.groupby('省份').mean())
print(df.groupby('省份').size())
print(df.groupby('省份').count())
结果为:
人数
省份
beijing 3.0
hubei 2.0
hunan 10.0
人数
省份
beijing 3.0
hubei 2.0
hunan 5.0
省份
beijing 2
hubei 1
hunan 2
dtype: int64
人数 name
省份
beijing 1 2
hubei 1 1
hunan 2 2
set_index
DataFrame可以通过set_index方法,可以设置单索引和复合索引。 所有的参数如下:
DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
In [1]: data
Out[1]:
a b c d
0 bar one z 1.0
1 bar two y 2.0
2 foo one x 3.0
3 foo two w 4.0
In [2]: indexed1 = data.set_index('c')
In [3]: indexed1
Out[3]:
a b d
c
z bar one 1.0
y bar two 2.0
x foo one 3.0
w foo two 4.0
In [4]: indexed2 = data.set_index(['a', 'b'])
In [5]: indexed2
Out[5]:
c d
a b
bar one z 1.0
two y 2.0
foo one x 3.0
two w 4.0
当keys
的输入值为一个列名时,添加了单索引,当添加多个时为复合索引。
stack
stack()
是将原来的列索引转成了最内层的行索引,这里是多层次索引:
reset_index
reset_index可以还原索引,重新变为默认的整型索引,可以视作set_index 的逆运算。
reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
简单应用:
In [1]: data
Out[1]:
c d
a b
bar one z 1.0
two y 2.0
foo one x 3.0
two w 4.0
In [2]: data.reset_index()
Out[2]:
a b c d
0 bar one z 1.0
1 bar two y 2.0
2 foo one x 3.0
3 foo two w 4.0
但是在复杂一点的情况下有些不同。
level
表示需要转化为列的索引,没有加入的则不转化,默认全部转化。
index = pd.MultiIndex.from_tuples([('bird', 'falcon'),
('bird', 'parrot'),
('mammal', 'lion'),
('mammal', 'monkey')],
names=['class', 'name'])
columns = pd.MultiIndex.from_tuples([('speed', 'max'),
('species', 'type')])
df = pd.DataFrame([(389.0, 'fly'),
( 24.0, 'fly'),
( 80.5, 'run'),
(np.nan, 'jump')],
index=index,
columns=columns)
df
speed species
max type
class name
bird falcon 389.0 fly
parrot 24.0 fly
mammal lion 80.5 run
monkey NaN jump
df.reset_index(level='class')
class speed species
max type
name
falcon bird 389.0 fly
parrot bird 24.0 fly
lion mammal 80.5 run
monkey mammal NaN jump
当存在索引存在无名的下级索引时,如果level
取默认值,那么dataframe
会自动生成列来装下下级索引,如果指定,那么下级索引会保留:
print(test_df,'\n')
print(test_df.set_index('canteen').stack().reset_index(),'\n')
print(test_df.set_index('canteen').stack().reset_index(level='canteen'),'\n')
canteen food_breakfast food_lunch food_dinner
0 1 1 4 3
canteen level_1 0
0 1 food_breakfast 1
1 1 food_lunch 4
2 1 food_dinner 3
canteen 0
food_breakfast 1 1
food_lunch 1 4
food_dinner 1 3
练习
将
canteen food_breakfast food_lunch food_dinner
0 1 1 4 3
转化为:
canteen time score
0 1 food_breakfast 1
1 1 food_lunch 4
2 1 food_dinner 3
答案:
test_df.set_index('canteen').stack().reset_index().rename(columns={'level_1':'time', 0:'score'})