学习内容:
一、 创建数据透视表
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'''