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      退货中
  1. 计算上半年订单总额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
  1. 获取上半年用户地区,查看各地区订单数量
# '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
  1. 找出上半年和下半年购买过相同商品的用户
# 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
  1. 查看上半年退货商品总额
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
  1. 汇总全年订单数据
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
  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 高级数据处理相关推荐

  1. 轩小陌的Python笔记-Pandas 数据处理

    Pandas 数据处理 一.数据IO操作 pandas IO操作主要是读取和写入有特定格式的文件,如CSV文件.TXT文件: # 本质上pd.read_csv和pd.read_tablepd.read ...

  2. 轩小陌的Python笔记-day06 数据类型

    day06 数据类型(中) 常见的数据类型: int,整数类型(整形) bool,布尔类型 str,字符串类型 list,列表类型 tuple,元组类型 dict,字典类型 set,集合类型 floa ...

  3. 轩小陌的Python笔记-day13 匿名函数、生成器、内置函数、推导式

    day13 内置函数和推导式 今日概要: 匿名函数 生成器 内置函数 附加:推导式,属于数据类型的知识,内部的高级的用法会涉及到[生成器]和[函数]的内容. 1. 匿名函数 传统的函数的定义包括了:函 ...

  4. 轩小陌的Python笔记-day02 快速上手

    day02 快速上手 课程目标:学习Python最基础的语法知识,可以用代码快速实现一些简单的功能. 课程概要: 初识编码(密码本) 编程初体验 输出 初识数据类型 变量 注释 输入 条件语句 1.初 ...

  5. 轩小陌的Python笔记-day16 模块二总结

    day16 阶段总结 课程目标:对第二模块 "函数和模块" 阶段的知识点进行总结. 课程概要: 知识补充 阶段总结(思维导图) 1. 知识补充 1.1 nolocal关键字 在之前 ...

  6. 轩小陌的Python笔记-day25 MySQL入门

    第四模块 MySQL数据库 从今天开始将进入第四模块的学习,这个模块就是给大家讲解MySQL数据库. 以前,在开发程序时,我们会把很多的数据和信息存储到某个文件夹中的文件中,例如:user.txt . ...

  7. 轩小陌的Python笔记-day08 模块一总结

    day08 阶段总结和考试题 课程目标:对第一模块 "Python基础" 阶段的知识点进行总结,更好地掌握此模块的相关知识. 课程概要: 代码规范 知识补充 阶段总结(思维导图) ...

  8. 轩小陌的Python笔记-day28 索引、函数及存储过程

    day28 索引和函数及存储过程 课程目标:了解 MySQL 中索引.函数.存储过程.函数.触发器.视图等知识点. 课程概要: 索引 函数 存储过程 视图 触发器 1. 索引 在数据库中索引最核心的作 ...

  9. 轩小陌的Python笔记-day26 必备SQL语句、表关系及授权

    day26 必备SQL和表关系及授权 课程目标:掌握开发中最常见的SQL语句和表关系及授权相关知识点. 课程概要: 必备SQL(8个必备) 表关系 授权 1. 必备SQL语句 上一节讲解了最基础SQL ...

  10. 轩小陌的Python笔记-day14 自定义模块、第三方模块、内置模块(部分)

    day14 模块 课程目标:掌握Python中常用模块的使用方法. 今日概要: 自定义模块(包) 第三方模块 内置模块[1/2] 1. 自定义模块 1.1 模块和包 import hashlibdef ...

最新文章

  1. python基础实例-Python入门基础知识实例,值得收藏!
  2. 计算机配置里面没有网络选项,主编教您win10网络设置中没有wlan选项怎么办
  3. 【数据分析R语言系列】R语言函数与函数式编程、作用域和apply 家族
  4. Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换
  5. 空间谱专题10:MUSIC算法
  6. java se 1335,1335.逼退法王
  7. 上线 5 天获得 100 万用户,可为什么我开发的 App 最终却倒闭了?
  8. ros 三线负载均衡
  9. 分布式及架构设计理论
  10. 不同手机型号图文预览_手机型号的不同后缀都代表什么意思?看完买手机再也不入坑!...
  11. 楼板计算塑形弹性_土木吧丨弹性与弹塑性计算差异性分析
  12. FileInputStream.read()返回int类型原因
  13. 2008R2虚拟机重启后进入系统恢复界面
  14. 八字易经算法之用JAVA实现硬币卜卦辅助工具
  15. cannot resolve xxx 解决方法
  16. Thinkbook14/15 Gen2 ITL出厂镜像恢复系统提示“PRELOAD FAIL”的解决方案
  17. java实现七巧板问题_[Java教程]canvas,绘制七巧板
  18. 基于单片机蓄电池充放电检测系统设计-毕设资料
  19. 云原生实践之 RSocket 从入门到落地:Servlet vs RSocket
  20. STM32定时器同步功能1

热门文章

  1. 最新版火车头织梦内容发布规则_火车头采集 - 织梦图集发布模块的制作
  2. 金色传说:SAP-FICO-COPA:创建销售订单时,获利能力段不自动带出,报错消息号KE0C133:特性值 2720000100000001对于特性 EXTWG 不存在 (外部物料组)
  3. java timer异常_JAVA Timer的缺陷以及解决办法
  4. python面向对象oo是什么意思_python进阶:面向对象是什么意思?
  5. cf 581A— Vasya the Hipster
  6. 威廉玛丽学院计算机教授刘旭,国家超级计算济南中心,欢迎您!
  7. Scala入门小纸条(3)
  8. banner定制网站
  9. 2022 CNCC 中国计算机大会参会总结
  10. Python第三方库安装