轩小陌的Python笔记-Pandas 高级数据处理
Pandas 高级数据处理
一、级联
pd.concat(objs, axis=1, verify_integrity=False, keys, ignore_index=False, sort=False, join=‘outer’)
级联语法的核心就是索引对齐
级联的应用场景:不同期,但是结构相同的数据汇总
objs:列表/元组
axis = 0 列索引对齐, axis=1 行索引对齐
df1 = pd.DataFrame(data=[[1,2,3]], columns=list('ABC'))
df2 = pd.DataFrame(data=[[2,3,4]], columns=list('ABC'))res2 = pd.concat([df1, df2], axis=1)
print(res2)
>>输出结果:A B C A B C
0 1 2 3 2 3 4# 校验级联之后是否有重复索引
pd.concat((df1, df2), axis=1, verify_integrity=True)# 通过多层级索引来处理重复索引的问题
pd.concat((df1, df2), axis=1, keys=['上半年','下半年'],names=['周期','产品'])
>>输出结果:
周期 上半年 下半年
产品 A B C A B C
0 1 2 3 2 3 4# 通过忽略索引的方式来处理重复索引的问题
pd.concat((df1, df2), ignore_index=True)
>>输出结果:A B C
0 1 2 3
1 2 3 4df3 = pd.DataFrame(data=[[1,2,3,4]], columns=list('CDAB'))
pd.concat((df3, df2))
>>输出结果:A B C D
0 3 4 1 2.0
0 2 3 4 NaN# outer:保留级联方向的所有标签(并集),innert:保留级联方向的共有标签(交集)
df4 = pd.DataFrame(data=np.random.randint(0, 100, size=(3,4)), columns=list('ABCD'))
print(df4)
>>输出结果:A B C D
0 82 20 46 14
1 51 14 31 47
2 23 18 47 38
df5 = pd.DataFrame(data=np.random.randint(-100, 0, size=(4,3)), columns=list('BDE'))
print(df5)
>>输出结果:B D E
0 -18 -1 -5
1 -32 -19 -73
2 -63 -20 -73
3 -15 -45 -61pd.concat((df4, df5, df1), sort=True, join='outer')
>>输出结果:A B C D E
0 82.0 20 46.0 14.0 NaN
1 51.0 14 31.0 47.0 NaN
2 23.0 18 47.0 38.0 NaN
0 NaN -18 NaN -1.0 -5.0
1 NaN -32 NaN -19.0 -73.0
2 NaN -63 NaN -20.0 -73.0
3 NaN -15 NaN -45.0 -61.0
0 1.0 2 3.0 NaN NaN
二、合并
合并就是根据两张表的公共信息,把两张表的数据汇总的方法。
合并以列的内容为参考标准,不存在行合并,都是列合并。
合并的列通常是离散型数据。可以是数值型。
合并的列之间存在一对一、一对多、多对多关系,否则合并结果为空。
案例
first_half_year = pd.read_excel('合并表格案例.xlsx', sheet_name=0)
first_half_year.head()
>>输出结果:用户ID 商品ID 订单ID 购买数量
0 lucy 10001 1009 1
1 jack 10002 1002 2
2 lucy 10003 1007 1
3 alex 10004 1010 1
4 mery 10005 1008 1second_half_year = pd.read_excel('合并表格案例.xlsx', sheet_name=1)
second_half_year.head()
>>输出结果:用户ID 商品ID 订单ID 购买数量
0 tom 10006 2001 1
1 oldshang 10003 2002 1
2 小陌 10004 2003 1
3 小明 10004 2004 2
4 小红 10001 2005 1user_table = pd.read_excel('合并表格案例.xlsx', sheet_name=2)
user_table.head()
>>输出结果:用户ID 地区 VIP等级 手机号
0 lucy 北京 3 13054344433
1 智哥 深圳 3 13046798795
2 mery 北京 2 17877659878
3 jack 上海 4 18635482221
4 alex 北京 1 17601002323product_table = pd.read_excel('合并表格案例.xlsx', sheet_name=3)
product_table.head()
>>输出结果:商品ID 商品类别 商品品牌 商品单价
0 10001 笔记本 华为 8000
1 10002 笔记本 小米 7600
2 10003 鼠标 华为 300
3 10004 鼠标 apple 600
4 10005 键盘 apple 1000return_table = pd.read_excel('合并表格案例.xlsx', sheet_name=4)
return_table.head()
>>输出结果:订单_id 退货状态
0 1003 退货中
1 1004 退货中
2 1005 退货完成
3 1011 退货完成
4 1014 退货中
- 计算上半年订单总额GMV
# 两张表合并时,默认是根据所有的相同字段名称的列来进行合并
res1 = pd.merge(left=first_half_year, right=product_table)
>>输出结果:用户ID 商品ID 订单ID 购买数量 商品类别 商品品牌 商品单价
0 lucy 10001 1009 1 笔记本 华为 8000
1 tom 10001 1011 1 笔记本 华为 8000
2 jack 10002 1002 2 笔记本 小米 7600
3 小陌 10002 1013 1 笔记本 小米 7600
4 alex 10002 1001 3 笔记本 小米 7600
5 mery 10002 1015 2 笔记本 小米 7600
6 lucy 10003 1007 1 鼠标 华为 300
7 alex 10004 1010 1 鼠标 apple 600
8 智哥 10004 1004 1 鼠标 apple 600
9 mery 10005 1008 1 键盘 apple 1000
10 jack 10006 1003 1 键盘 小米 200res1['订单总额'] = res1['购买数量'] * res1['商品单价']
res1['订单总额'].sum()
>>输出结果:
79500
- 获取上半年用户地区,查看各地区订单数量
# 'left','right','outer','inner'都是基于列的内容合并
# inner:只保留合并列内容的交集
# outer:保留合并列内容的并集
# left:保留左表拥有的内容
# right:保留右表拥有的内容
pd.merge(left=first_half_year, right=user_table, how='inner')['地区'].value_counts()
>>输出结果:
北京 6
上海 3
深圳 2
Name: 地区, dtype: int64
- 找出上半年和下半年购买过相同商品的用户
# on:多个相同名称的字段中,指定合并要参考的列标签
# suffixes:为其他相同名称的字段且未参与合并的列添加后缀名称
pd.merge(left=first_half_year, right=second_half_year, on=['用户ID','商品ID'], suffixes=['_上半年','_下半年'])
>>输出结果:用户ID 商品ID 订单ID_上半年 购买数量_上半年 订单ID_下半年 购买数量_下半年
0 lucy 10003 1007 1 2007 1
1 mery 10005 1008 1 2010 1
2 小陌 10002 1013 1 2008 1
3 智哥 10004 1004 1 2011 3
- 查看上半年退货商品总额
res2 = pd.merge(left=first_half_year, right=return_table, left_on='订单ID', right_on='订单_id')
res3 = pd.merge(left=res2, right=product_table, how='inner')
>>输出结果:用户ID 商品ID 订单ID 购买数量 订单_id 退货状态
0 lucy 10003 1007 1 1007 退货完成
1 jack 10006 1003 1 1003 退货中
2 智哥 10004 1004 1 1004 退货中
3 tom 10001 1011 1 1011 退货完成
(res3['购买数量']*res3['商品单价']).sum()
>>输出结果:
9100
- 汇总全年订单数据
total = pd.concat((first_half_year, second_half_year), ignore_index=True)
total.head()
>>输出结果:用户ID 商品ID 订单ID 购买数量
0 lucy 10001 1009 1
1 jack 10002 1002 2
2 lucy 10003 1007 1
3 alex 10004 1010 1
4 mery 10005 1008 1
- 计算全年客单价(每一单成交金额均值)
res4 = pd.merge(left=total, right=product_table)
>>输出结果:用户ID 商品ID 订单ID 购买数量 商品类别 商品品牌 商品单价
0 lucy 10001 1009 1 笔记本 华为 8000
1 tom 10001 1011 1 笔记本 华为 8000
2 小红 10001 2005 1 笔记本 华为 8000
3 jack 10002 1002 2 笔记本 小米 7600
4 小陌 10002 1013 1 笔记本 小米 7600(res4['购买数量'] * res4['商品单价']).mean()
>>输出结果:
5126.086956521739
三、分组
df = pd.read_excel('分组表格案例.xlsx', index_col=0)
df.head()
>>输出结果:菜品 颜色 价格 数量
0 白菜 绿 64 88
1 白菜 红 24 98
2 冬瓜 红 0 43
3 辣椒 红 59 51
4 西红柿 白 29 29
- groupby(by=[列标签1,列标签2,…]),返回一个DataFrameGroupBy对象
# DataFrameGroupBy对象可以直接响应pandas的聚合函数
# 注意:聚合方法只能对可运算类型有效
df.groupby(by=['菜品'])['数量'].sum()
>>输出结果:
菜品
冬瓜 220
白菜 310
西红柿 229
辣椒 573
Name: 数量, dtype: int64df.groupby(by=['菜品'])['价格'].mean()
>>输出结果:
菜品
冬瓜 53.000
白菜 34.375
西红柿 18.000
辣椒 41.000
Name: 价格, dtype: float64df.groupby(by=['菜品','颜色'])['价格'].mean()
>>输出结果:菜品 颜色
冬瓜 白 67.666667红 38.333333
白菜 白 24.200000红 45.000000绿 64.000000
西红柿 白 25.500000红 12.000000绿 13.500000
辣椒 白 40.200000红 41.666667
Name: 价格, dtype: float64
- 定制多种聚合指标
gpobj = df.groupby('菜品')# agg 接收一个字典对象
# 字典对象里:键是要聚合的列名称, 值是一个函数名字(地址),是一个聚合函数
gpobj.agg({'价格':np.mean,'数量':np.sum
})
>>输出结果:价格 数量
菜品
冬瓜 53.000 220
白菜 34.375 310
西红柿 18.000 229
辣椒 41.000 573
- 高级聚合
def my_mean(x):# 对于分组对象而言,apply传递的函数,接收到的参数x是一组数据return x.mean()df.groupby('菜品')['价格'].apply(my_mean)
>>输出结果:
菜品
冬瓜 53.000
白菜 34.375
西红柿 18.000
辣椒 41.000
Name: 价格, dtype: float64
- groups:可以用于查看DataFrameGroupBy所表达的分组情况
df.groupby(by=['菜品']).groups
>>输出结果:
{'冬瓜': Int64Index([2, 6, 7, 8, 21, 28], dtype='int64'),'白菜': Int64Index([0, 1, 5, 13, 17, 25, 26, 27], dtype='int64'),'西红柿': Int64Index([4, 10, 14, 22, 29], dtype='int64'),'辣椒': Int64Index([3, 9, 11, 12, 15, 16, 18, 19, 20, 23, 24], dtype='int64')}df.loc[[0, 1, 5, 13, 17, 25, 26, 27]]
>>输出结果:菜品 颜色 价格 数量
0 白菜 绿 64 88
1 白菜 红 24 98
5 白菜 白 5 37
13 白菜 红 66 11
17 白菜 白 10 39
25 白菜 白 70 26
26 白菜 白 10 2
27 白菜 白 26 9
四、交叉表
交叉表统计的是数量 count
# index:是一个序列,而不是一个列标签
pd.crosstab(index=df['菜品'], columns=df['颜色'])
>>输出结果:
颜色 白 红 绿
菜品
冬瓜 3 3 0
白菜 5 2 1
西红柿 2 1 2
辣椒 5 6 0
五、透视表
# data:数据源,要进行透视的DataFrame对象
# index\columns:透视表的行列是从数据源的哪列提取的
# values:要统计的数据源中的字段
# aggfunc:聚合方法,传递的是函数名字
pd.pivot_table(data=df, index='菜品', columns='颜色', values=['价格'], aggfunc=np.mean)
>>输出结果:
价格
颜色 白 红 绿
菜品
冬瓜 67.666667 38.333333 NaN
白菜 24.200000 45.000000 64.0
西红柿 25.500000 12.000000 13.5
辣椒 40.200000 41.666667 NaN
案例1:美国各州人口密度分析
1.1 首先导入文件,并查看数据样本
# 州的全称和州名称简写对应关系表
abb = pd.read_csv('./data/state-abbrevs.csv')
>>输出结果:state abbreviation
0 Alabama AL
1 Alaska AK
2 Arizona AZ
3 Arkansas AR
4 California CA# 州的全称和面积表
areas = pd.read_csv('./data/state-areas.csv')
>>输出结果:state area (sq. mi)
0 Alabama 52423
1 Alaska 656425
2 Arizona 114006
3 Arkansas 53182
4 California 163707# 州名称的简写和面积表,包括年龄和年份信息
population = pd.read_csv('./data/state-population.csv')
>>输出结果:state/region ages year population
0 AL under18 2012 1117489.0
1 AL total 2012 4817528.0
2 AL under18 2010 1130966.0
3 AL total 2010 4785570.0
4 AL under18 2011 1125763.0
1.2 合并pop与abbrevs两个DataFrame,分别依据state/region列和abbreviation列来合并。
为了保留所有数据,使用外合并。
# 默认合并的规则是查找字段名称相同的列
# 合并的列在内容上,要存在一对一、一对多、多对多的关系
temp = pd.merge(left=population, right=abb, left_on='state/region', right_on='abbreviation', how='outer')
>>输出结果:state/region ages year population state abbreviation
0 AL under18 2012 1117489.0 Alabama AL
1 AL total 2012 4817528.0 Alabama AL
2 AL under18 2010 1130966.0 Alabama AL
3 AL total 2010 4785570.0 Alabama AL
4 AL under18 2011 1125763.0 Alabama AL
...
1.3 查看存在缺失数据的列。
使用.isnull().any(),只要某一列存在一个缺失数据,就会显示True。
temp.isnull().any()
>>输出结果:
state/region False
ages False
year False
population True
state True
abbreviation True
dtype: bool
1.4 根据数据是否缺失情况显示数据,如果缺失为True,则显示
temp.loc[temp.isnull().any(axis=1)]
>>输出结果:state/region ages year population state abbreviation
2448 PR under18 1990 NaN NaN NaN
2449 PR total 1990 NaN NaN NaN
2450 PR total 1991 NaN NaN NaN
2451 PR under18 1991 NaN NaN NaN
2452 PR total 1993 NaN NaN NaN
... ... ... ... ... ... ...
2539 USA total 2010 309326295.0 NaN NaN
2540 USA under18 2011 73902222.0 NaN NaN
2541 USA total 2011 311582564.0 NaN NaN
2542 USA under18 2012 73708179.0 NaN NaN
2543 USA total 2012 313873685.0 NaN NaN
96 rows × 6 columns
1.5 找到state/region列中有哪些行的state值为NaN,使用unique()查看非重复值
temp.loc[temp.isnull().any(axis=1), 'state/region'].unique()
>>输出结果:
array(['PR', 'USA'], dtype=object)
1.6 为上面找到值为NaN的state项补上正确的值,从而去掉state列的所有NaN
# 经过上面分析,只有PR和USA对应的state有空值,所以只需要填写这两组数据即可。且因为USA不是某个州的数据,所以这里可以不作处理。
# 找到面积表中存PR州对应的全称
set(areas['state']) - set(abb['state'])
>>输出结果:
{'Puerto Rico'}# 为PR行中的state列进行重新赋值
temp.loc[temp['state/region'] == 'PR', 'state'] = 'Puerto Rico'
# 注意:不能用间接访问进行赋值。间接访问可以读,不可以写。
# temp.loc[temp['state/region'] == 'PR']['state'] = 'Puerto Rico'
1.7 删除state/region中值为USA对应的行数据
# 由于USA是全美国的数据,在本案例中不需要保留,可以删除
usa_index = temp.loc[temp['state/region'] == 'USA'].index
pop_abb = temp.drop(labels=usa_index).copy()pop_abb.isnull().any()
>>输出结果:
state/region False
ages False
year False
population True
state False
abbreviation True
dtype: bool# 由于abbreviation列跟state/region列数据表示的是同一个内容,且abbreviation列存在空值,则也可以删除abbreviation列
pop_abb = pop_abb.drop(labels=['abbreviation'], axis=1)
1.8 继续寻找存在缺失数据的列,删除无效数据
pop_abb.isnull().any()
>>输出结果:
state/region False
ages False
year False
population True
state False
dtype: bool# 由于2000年之前,没有统计过PR州的人口数据,所以删除该部分数据
pop_abb.dropna(inplace=True)
1.9 合并各州面积数据areas,使用外合并
total = pd.merge(left=pop_abb, right=areas, how='outer')
1.10 计算人口密度。注意是Series/Series,其结果还是一个Series
total['density'] = total['population']/total['area (sq. mi)']
1.11 排序,并找出2012年全民人口密度最高的五个州
pop_2012_total = total.query('year == 2012 & ages == "total"')
density_df = pop_2012_total.sort_values('density', ascending=False)
# 为了让显示更直观,可以将state设置为行索引
density_df.set_index('state').head()
>>输出结果:state/region ages year population area (sq. mi) densitystate
District of Columbia DC total 2012 633427.0 68 9315.102941
Puerto Rico PR total 2012 3651545.0 3515 1038.846373
New Jersey NJ total 2012 8867749.0 8722 1016.710502
Rhode Island RI total 2012 1050304.0 1545 679.808414
Connecticut CT total 2012 3591765.0 5544 647.865260
案例2:美国2012年总统候选人政治献金数据分析
1.1 读取文件并查看数据结构
root = './usa_elect/'party_df = ""
contdf_list = []
for fname in os.listdir(root):fpath = os.path.join(root, fname)if fname.endswith('.csv'):contdf_list.append(pd.read_csv(fpath))elif fname.endswith('.xlsx'):party_df = pd.read_excel(fpath, index_col=0)# 对contdf_list中的3个df对象进行纵向级联
contb = pd.concat(contdf_list, ignore_index=True)# 查看数据结构
contb.info()
>>输出结果:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1001733 entries, 0 to 1001732
Data columns (total 7 columns):
cand_nm 1001733 non-null object
contbr_nm 1001733 non-null object
contbr_st 1001729 non-null object
contbr_employer 988004 non-null object
contbr_occupation 993303 non-null object
contb_receipt_amt 1001733 non-null float64
contb_receipt_dt 1001733 non-null object
dtypes: float64(1), object(6)
memory usage: 53.5+ MBcontb.head()
>>输出结果:cand_nm contbr_nm contbr_st contbr_employer contbr_occupation contb_receipt_amt contb_receipt_dt
0 Bachmann, Michelle HARVEY, WILLIAM AL RETIRED RETIRED 250.0 20-JUN-11
1 Bachmann, Michelle HARVEY, WILLIAM AL RETIRED RETIRED 50.0 23-JUN-11
2 Bachmann, Michelle SMITH, LANIER AL INFORMATION REQUESTED INFORMATION REQUESTED 250.0 05-JUL-11
3 Bachmann, Michelle BLEVINS, DARONDA AR NONE RETIRED 250.0 01-AUG-11
4 Bachmann, Michelle WARDENBURG, HAROLD AR NONE RETIRED 300.0 20-JUN-11party_df.info()
>>输出结果:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 13 entries, 0 to 12
Data columns (total 2 columns):
names 13 non-null object
party 13 non-null object
dtypes: object(2)
memory usage: 312.0+ bytesparty_df.head()
>>输出结果:names party
0 Bachmann, Michelle Republican
1 Romney, Mitt Republican
2 Obama, Barack Democrat
3 Roemer, Charles E. 'Buddy' III Reform
4 Pawlenty, Timothy Republican
1.2 根据候选人姓名将contb和party_df两个dataFrame对象进行合并
contb_part = pd.merge(left=contb, right=party_df, left_on='cand_nm', right_on='names', how='left')
contb_part.head(1)
>>输出结果:cand_nm contbr_nm contbr_st contbr_employer contbr_occupation contb_receipt_amt contb_receipt_dt names party
0 Bachmann, HARVEY, AL RETIRED RETIRED 250.0 20-JUN-11 Bachmann, RepublicanMichelle WILLIAM Michelle
1.3 查看有多少个党派参与了竞选
contb_part.party.unique()
>>输出结果:
array(['Republican', 'Democrat', 'Reform', 'Libertarian'], dtype=object)
1.4 查看党派的支持度
# 使用value_counts()函数,统计party列中各个元素出现次数,表示各党派支持的人次
contb_part.party.value_counts()
>>输出结果:
Democrat 593747
Republican 400832
Reform 5920
Libertarian 1234
Name: party, dtype: int64# 使用groupby()函数,查看各个党派收到的政治献金总数contb_receipt_amt
contb_part.groupby('party')['contb_receipt_amt'].sum()
>>输出结果:
party
Democrat 1.335028e+08
Libertarian 5.669616e+05
Reform 3.674575e+05
Republican 1.643154e+08
Name: contb_receipt_amt, dtype: float64
1.5 查看具体每天各个党派收到的政治献金总数contb_receipt_amt
# 由于contb_part中的时间列contb_receipt_dt为object类型,因此需要先将该列数据转为datetime类型
# pandas to_datetime函数,可以批量转换符合时间格式的字符串为时间类型(Timestamp)
# contb_receipt_dt列的数据:20-JUN-11是一个标准欧式时间格式日-月-年,可以直接通过pd.to_datetime()进行批量转换
contb_part.contb_receipt_dt = pd.to_datetime(contb_part['contb_receipt_dt'])
contb_part.contb_receipt_dt.head()
>>输出结果:
0 2011-06-20
1 2011-06-23
2 2011-07-05
3 2011-08-01
4 2011-06-20
Name: contb_receipt_dt, dtype: datetime64[ns]# 补充:假设contb_receipt_dt列的数据:20-JUN-11不是标准时间格式,则可以通过自定义函数加map方式进行转换
month_dict = {'JAN' : 1, 'FEB' : 2, 'MAR' : 3, 'APR' : 4, 'MAY' : 5, 'JUN' : 6, 'JUL' : 7, 'AUG' : 8, 'SEP' : 9, 'OCT': 10, 'NOV': 11, 'DEC' : 12}
def transform_date_string(x):# 判断接收的x是否为一个字符串对象if isinstance(x, str):day, mon, year = x.split('-')month = month_dict[mon]return '20%d-%d-%d'%(int(year), int(month), int(day))date_string = contb_part.contb_receipt_dt.map(transform_date_string)
contb_part.contb_receipt_dt = pd.to_datetime(date_string)# 根据时间进行排序
contb_part.sort_values(by='contb_receipt_dt', inplace=True)# 查看每天各党派收到的政治献金总数
group_df = contb_part.groupby(by=['contb_receipt_dt','party'])['contb_receipt_amt'].sum()
# 为方便显示,使用unstack()将上面所得数据中的party从一级索引变成列索引
piovt_table = group_df.unstack()
# 将空值NaN进行填充
piovt_table.fillna(value=0.0, inplace=True)
>>输出结果:
party Democrat Libertarian Reform Republican
contb_receipt_dt
2011-01-01 0.00 0.00 0.00 8600.00
2011-01-03 0.00 0.00 0.00 4800.00
2011-01-04 0.00 0.00 0.00 5000.00
2011-01-12 0.00 0.00 0.00 4150.00
2011-01-13 0.00 0.00 0.00 4000.00
... ... ... ... ...
2012-04-26 537115.38 1805.00 25.00 505311.33
2012-04-27 745269.95 350.00 560.00 593983.56
2012-04-28 479677.34 0.00 110.00 80759.16
2012-04-29 349744.69 0.00 0.00 61421.02
2012-04-30 3499159.38 0.00 35.00 787702.81
466 rows × 4 columns# 查看各党派根据时间累计收到的政治献金总数
piovt_table.cumsum()
>>输出结果:
party Democrat Libertarian Reform Republican
contb_receipt_dt
2011-01-01 0.000000e+00 0.00 0.00 8.600000e+03
2011-01-03 0.000000e+00 0.00 0.00 1.340000e+04
2011-01-04 0.000000e+00 0.00 0.00 1.840000e+04
2011-01-12 0.000000e+00 0.00 0.00 2.255000e+04
2011-01-13 0.000000e+00 0.00 0.00 2.655000e+04
... ... ... ... ...
2012-04-26 1.284289e+08 566611.60 366752.54 1.627915e+08
2012-04-27 1.291742e+08 566961.60 367312.54 1.633855e+08
2012-04-28 1.296539e+08 566961.60 367422.54 1.634663e+08
2012-04-29 1.300036e+08 566961.60 367422.54 1.635277e+08
2012-04-30 1.335028e+08 566961.60 367457.54 1.643154e+08
1.6 查看各候选人中,政治献金捐献者的职业以及捐献情况
contb_part.groupby(by=['cand_nm','contbr_occupation'])['contb_receipt_amt'].sum()
>>输出结果:
cand_nm contbr_occupation
Bachmann, Michelle -- 75.00100% DISABLED VETERAN 1869.50100% DISABLED VIETNAM VETERAN 236.25A/C AND HEAT 250.00ACADEMIC EMPLOYMENT SPECIALIST 25.00...
Santorum, Rick WRITER/PROFESSOR 910.00X-RAY TECHNICIAN 2500.00XRAY TECH 380.00YOUTH MINISTER 475.00YOUTH MINISTRY 250.00
Name: contb_receipt_amt, Length: 59313, dtype: float64
1.7 查看政治献金捐献者中,老兵主要支持谁
condtion = contb_part.contbr_occupation == 'DISABLED VETERAN'
support_man = contb_part.loc[condtion, 'cand_nm'].value_counts()
>>输出结果:
Obama, Barack 97
Paul, Ron 46
Santorum, Rick 6
Cain, Herman 3
Gingrich, Newt 1
Roemer, Charles E. 'Buddy' III 1
Name: cand_nm, dtype: int64# 把索引变成列
support_man_df = good_man.reset_index()
support_man_df.columns = ['cand_nm', 'counts']
support_man_df.set_index('cand_nm').T
>>输出结果:
cand_nm Obama, Barack Paul, Ron Santorum, Rick Cain, Herman Gingrich, Newt Roemer, Charles E. 'Buddy' III
counts 97 46 6 3 1 1
1.8 找出各个候选人的捐赠者中,捐赠金额最大的人的职业以及捐献额
max_amt = contb_part.contb_receipt_amt.max()
contb_part.query(f'contb_receipt_amt == {max_amt}')
>>输出结果:cand_nm contbr_nm contbr_st contbr_employer contbr_occupation contb_receipt_amt contb_receipt_dt names party
325136 Obama, Barack OBAMA VICTORY FUND IL NaN NaN 2014490.51 2012-02-29 Obama, Barack Democrat2012 - UNITEMIZED
轩小陌的Python笔记-Pandas 高级数据处理相关推荐
- 轩小陌的Python笔记-Pandas 数据处理
Pandas 数据处理 一.数据IO操作 pandas IO操作主要是读取和写入有特定格式的文件,如CSV文件.TXT文件: # 本质上pd.read_csv和pd.read_tablepd.read ...
- 轩小陌的Python笔记-day06 数据类型
day06 数据类型(中) 常见的数据类型: int,整数类型(整形) bool,布尔类型 str,字符串类型 list,列表类型 tuple,元组类型 dict,字典类型 set,集合类型 floa ...
- 轩小陌的Python笔记-day13 匿名函数、生成器、内置函数、推导式
day13 内置函数和推导式 今日概要: 匿名函数 生成器 内置函数 附加:推导式,属于数据类型的知识,内部的高级的用法会涉及到[生成器]和[函数]的内容. 1. 匿名函数 传统的函数的定义包括了:函 ...
- 轩小陌的Python笔记-day02 快速上手
day02 快速上手 课程目标:学习Python最基础的语法知识,可以用代码快速实现一些简单的功能. 课程概要: 初识编码(密码本) 编程初体验 输出 初识数据类型 变量 注释 输入 条件语句 1.初 ...
- 轩小陌的Python笔记-day16 模块二总结
day16 阶段总结 课程目标:对第二模块 "函数和模块" 阶段的知识点进行总结. 课程概要: 知识补充 阶段总结(思维导图) 1. 知识补充 1.1 nolocal关键字 在之前 ...
- 轩小陌的Python笔记-day25 MySQL入门
第四模块 MySQL数据库 从今天开始将进入第四模块的学习,这个模块就是给大家讲解MySQL数据库. 以前,在开发程序时,我们会把很多的数据和信息存储到某个文件夹中的文件中,例如:user.txt . ...
- 轩小陌的Python笔记-day08 模块一总结
day08 阶段总结和考试题 课程目标:对第一模块 "Python基础" 阶段的知识点进行总结,更好地掌握此模块的相关知识. 课程概要: 代码规范 知识补充 阶段总结(思维导图) ...
- 轩小陌的Python笔记-day28 索引、函数及存储过程
day28 索引和函数及存储过程 课程目标:了解 MySQL 中索引.函数.存储过程.函数.触发器.视图等知识点. 课程概要: 索引 函数 存储过程 视图 触发器 1. 索引 在数据库中索引最核心的作 ...
- 轩小陌的Python笔记-day26 必备SQL语句、表关系及授权
day26 必备SQL和表关系及授权 课程目标:掌握开发中最常见的SQL语句和表关系及授权相关知识点. 课程概要: 必备SQL(8个必备) 表关系 授权 1. 必备SQL语句 上一节讲解了最基础SQL ...
- 轩小陌的Python笔记-day14 自定义模块、第三方模块、内置模块(部分)
day14 模块 课程目标:掌握Python中常用模块的使用方法. 今日概要: 自定义模块(包) 第三方模块 内置模块[1/2] 1. 自定义模块 1.1 模块和包 import hashlibdef ...
最新文章
- python基础实例-Python入门基础知识实例,值得收藏!
- 计算机配置里面没有网络选项,主编教您win10网络设置中没有wlan选项怎么办
- 【数据分析R语言系列】R语言函数与函数式编程、作用域和apply 家族
- Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换
- 空间谱专题10:MUSIC算法
- java se 1335,1335.逼退法王
- 上线 5 天获得 100 万用户,可为什么我开发的 App 最终却倒闭了?
- ros 三线负载均衡
- 分布式及架构设计理论
- 不同手机型号图文预览_手机型号的不同后缀都代表什么意思?看完买手机再也不入坑!...
- 楼板计算塑形弹性_土木吧丨弹性与弹塑性计算差异性分析
- FileInputStream.read()返回int类型原因
- 2008R2虚拟机重启后进入系统恢复界面
- 八字易经算法之用JAVA实现硬币卜卦辅助工具
- cannot resolve xxx 解决方法
- Thinkbook14/15 Gen2 ITL出厂镜像恢复系统提示“PRELOAD FAIL”的解决方案
- java实现七巧板问题_[Java教程]canvas,绘制七巧板
- 基于单片机蓄电池充放电检测系统设计-毕设资料
- 云原生实践之 RSocket 从入门到落地:Servlet vs RSocket
- STM32定时器同步功能1
热门文章
- 最新版火车头织梦内容发布规则_火车头采集 - 织梦图集发布模块的制作
- 金色传说:SAP-FICO-COPA:创建销售订单时,获利能力段不自动带出,报错消息号KE0C133:特性值 2720000100000001对于特性 EXTWG 不存在 (外部物料组)
- java timer异常_JAVA Timer的缺陷以及解决办法
- python面向对象oo是什么意思_python进阶:面向对象是什么意思?
- cf 581A— Vasya the Hipster
- 威廉玛丽学院计算机教授刘旭,国家超级计算济南中心,欢迎您!
- Scala入门小纸条(3)
- banner定制网站
- 2022 CNCC 中国计算机大会参会总结
- Python第三方库安装