Python 数据分析— Pandas 基本操作(中)

发布于:2024-09-18 ⋅ 阅读:(54) ⋅ 点赞:(0)


学习内容:

一、 创建数据透视表

pivot_table(values=需聚合的列名默认所有数值列, index=行分组键(数组) [, columns=列上分组的键, aggfunc='sum’求和 | 'mean’均值 默认 | … ,fill_value=空值填充])

df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
                          "bar", "bar", "bar", "bar"],
                    "B": ["one", "one", "one", "two", "two",
                          "one", "one", "two", "two"],
                    "C": ["small", "large", "large", "small",
                          "small", "large", "small", "small",
                          "large"],
                    "D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
                    "E": [2, 4, 5, 5, 6, 6, 8, 9, 9]})
'''df结构:
	A	B	C		D	E
0	foo	one	small	1	2
1	foo	one	large	2	4
2	foo	one	large	2	5
3	foo	two	small	3	5
4	foo	two	small	3	6
5	bar	one	large	4	6
6	bar	one	small	5	8
7	bar	two	small	6	9
8	bar	two	large	7	9'''
df.pivot_table(index='A') # 根据列'A'创建数据透视表
'''输出:
	D	E
A		
bar	5.5	8.0
foo	2.2	4.4'''
# 以C为列分组,创建A、B的数据透视表,包括D列的和、数量、均值
df.pivot_table('D',index=['A','B'],columns='C',aggfunc=['sum',np.alen,'mean'])
'''输出:
		sum				alen			mean
	C	large	small	large	small	large	small
A	B						
bar	one	4.0		5.0		1.0		1.0		4.0		5.0
	two	7.0		6.0		1.0		1.0		7.0		6.0
foo	one	4.0		1.0		2.0		1.0		2.0		1.0
	two	NaN		6.0		NaN		2.0		NaN		3.0'''
#在前有基础上,将所胡NaN填充为0
df.pivot_table('D',index=['A','B'],columns='C',aggfunc=['sum',np.alen,'mean'],fill_value=0)
'''输出:
		sum				alen			mean
	C	large	small	large	small	large	small
A	B						
bar	one	4.0		5.0		1.0		1.0		4.0		5.0
	two	7.0		6.0		1.0		1.0		7.0		6.0
foo	one	4.0		1.0		2.0		1.0		2.0		1.0
	two	0		6.0		0		2.0		0		3.0'''

二、表格合并操作

pd.merge(left=左表(或Series) , right=右表, how=连接方式’left’按左键 | 'right’按右键 | ‘outer’ 左右键并集| ‘inner’左右键交集默认 | ‘cross’按两表笛卡尔集, on=共有键标签, left_on=左键标签(或left_index=True左表行索引), right_on=右键标签(或 right_index=True右表行索引), suffixes=同名标签后缀默认为[’_x’, ‘_y’]) -> DataFrame
注:当左右表有多个同名键时,同名键相乘组合

df1 = pd.DataFrame({'lkey': ['foo', 'bar', 'baz', 'lfoo'],
                     'value': [1, 2, 3, 5]})
'''df1结构:
	lkey	value
0	foo		1
1	bar		2
2	baz		3
3	foo		5'''
df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'rfoo'],
                     'value': [5, 6, 7, 8]})
'''df2结构:
	rkey	value
0	foo		5
1	bar		6
2	baz		7
3	foo		8'''
pd.merge(df1,df2,left_on='lkey',right_on='rkey') # 两表交集
'''输出:
	lkey	value_x	rkey	value_y
0	foo		1		foo		5
1	bar		2		bar		6
2	baz		3		baz		7'''
pd.merge(df1,df2,left_on='lkey',right_on='rkey',how='left') # 左表索引,右表无时为NaN
'''输出:
	lkey	value_x	rkey	value_y
0	foo		1		foo		5.0
1	bar		2		bar		6.0
2	baz		3		baz		7.0
3	lfoo	5		NaN		NaN'''

三、表格分组操作

groupby(by=分组标签[, axis=分割方向0行默认 | 1列]) -> DataFrameGroupBy[Scalar]

df = pd.DataFrame({'动物名': ['Falcon', 'Falcon','Parrot', 'Parrot'],
                   '类型':['Captive', 'Wild', 'Captive', 'Wild'],
                    '速度': [380., 370., 24., 26.]})
'''df结构:
	动物	类型	速度
0	鹰	豢养	380.0
1	鹰	野生	370.0
2	鹦鹉	豢养	24.0
3	鹦鹉	野生	26.0'''
a = df.groupby('动物') # 按动物名分组
#a是:<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f74d710b8>
list(a)
'''输出:
[('鹰',
    动物  类型     速度
  0  鹰  豢养	  380.0
  1  鹰  野生	  370.0),
 ('鹦鹉',
     动物  类型    速度
  2  鹦鹉  豢养 	 24.0
  3  鹦鹉  野生 	 26.0)]'''

利用get_group函数获取指定组数据

df.groupby('动物').get_group('鹦鹉')
'''输出:
	动物	类型	速度
2	鹦鹉	豢养	24.0
3	鹦鹉	野生	26.0'''

利用agg函数,对分组数据进行后序操作
求和(sum)、均值(mean)、中位数(median)、计数(count)、去重后个数(nunique)等

a = df.groupby('动物')
a.agg('max')
'''输出:
	类型	速度
动物		
鹦鹉	野生	26.0
鹰	野生	380.0'''

四、Series 值映射

map(映射关系, na_action=空值处理None同样映射,默认 | 'ignore’不传递) -> Series[S2@map]
DataFrame变量.列索引 -> 返回该列 Series 对象
1. 根据字典对应关系生成新序列

s = pd.Series(['cat', 'dog', np.nan, 'rabbit'])
'''s结构:
0       cat
1       dog
2       NaN
3    rabbit
dtype: object'''
s.map({'cat':'猫', 'dog':'狗', 'rabbit':'兔'})
'''输出:
0      猫
1      狗
2    NaN
3      兔
dtype: object'''

2. 格式化生成新序列

s.map('I am a {}'.format) # 不跳过空值
'''输出:
0       I am a cat
1       I am a dog
2       I am a nan
3    I am a rabbit
dtype: object'''
s.map('I am a {}'.format,na_action='ignore') # 跳过空值
'''输出:
0       I am a cat
1       I am a dog
2              NaN
3    I am a rabbit
dtype: object'''

五、替换 DataFrame 或 Series 中的值

replace( to_replace = 原值, value=新值, inplace=是否在原位置更改True是 | False否 默认) -> None

df = pd.DataFrame({
            '名称':['产品1','产品2','产品3','产品4','产品5'],
            '单价':[5,3,'N',7,2],
            '合计':[15,12,'N','S',8]})
'''df结构:
	名称		单价	合计
0	产品1	5	15
1	产品2	3	12
2	产品3	N	N
3	产品4	7	S
4	产品5	2	8'''
df.replace('N',0) # 将表格中的N替换为0,原表不变,输出
'''	名称		单价	合计
0	产品1	5	15
1	产品2	3	12
2	产品3	0	0
3	产品4	7	S
4	产品5	2	8'''
df.replace({'N':0, 'C':21},inplace=True) #将表中的N替换为0,S替换为21,在原表中更改
'''df=
	名称		单价	合计
0	产品1	5	15
1	产品2	3	12
2	产品3	0	0
3	产品4	7	21
4	产品5	2	8'''