草庐IT

3.5.4 分组、合并、透视表

小石小石摩西摩西 2023-12-01 原文

1.导入三方库

import numpy as np
import pandas as pd
df = pd.read_csv('table.csv',index_col='ID') #用来指定表格的索引值

df.head(2)
 SchoolClassGenderAddressHeightWeightMathPhysics
ID        
1101S_1C_1Mstreet_11736334.0A+
1102S_1C_1Fstreet_21927332.5B+

2.分组

单列分组

danlie = df.groupby('School')
danlie.sum()
 HeightWeightMath
School   
S_126361050956.2
S_2345915631191.1

多列分组

duolie = df.groupby(['School','Class'])
duolie.sum()
  HeightWeightMath
SchoolClass   
S_1C_1877363318.9
C_2853341321.5
C_3906346315.8
S_2C_1821384292.8
C_2900418314.0
C_3869419315.3
C_4869342269.0

提取指定字段并指定分组的列

tiqu = df['Address Math'.split()].groupby(by='Address')
tiqu.count()
 Math
Address 
street_13
street_26
street_48
street_56
street_66
street_76

</div>

3.合并

sheet = pd.ExcelFile('用户借款数据.xlsx')
sheet.sheet_names
['基础信息', '就业信息', '借款信息']
hb1 = pd.read_excel('用户借款数据.xlsx',sheet_name='基础信息')
hb2 = pd.read_excel('用户借款数据.xlsx',sheet_name='就业信息')
hb3 = pd.read_excel('用户借款数据.xlsx',sheet_name='借款信息')
hb1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 999 entries, 0 to 998
Data columns (total 8 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   编号       999 non-null    int64  
 1   城市       999 non-null    object 
 2   国家       999 non-null    object 
 3   出生日期     999 non-null    object 
 4   教育程度     999 non-null    int64  
 5   性别       999 non-null    int64  
 6   房屋所有权类型  763 non-null    float64
 7   婚姻状况     999 non-null    int64  
dtypes: float64(1), int64(4), object(3)
memory usage: 62.6+ KB
hb1.head(6)
 编号城市国家出生日期教育程度性别房屋所有权类型婚姻状况
00AESPAEE21/11/1975406.04
12P脛RNUEE25/10/1969419.01
23TALLINNEE22/11/1965401.04
34KEHTNAEE05/12/1983201.03
45KIVI脮LIEE13/07/1980414.03
56P脛RNUEE05/07/1993312.03

</div>

hb2.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 999 entries, 0 to 998
Data columns (total 9 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   编号         999 non-null    int64  
 1   申请签字时间     999 non-null    int64  
 2   申请签证周      999 non-null    int64  
 3   当前雇主的雇佣期限  926 non-null    object 
 4   就业岗位       962 non-null    object 
 5   就业状况       977 non-null    float64
 6   主要工作收入     999 non-null    int64  
 7   收入总额       999 non-null    int64  
 8   工作经验       999 non-null    object 
dtypes: float64(1), int64(5), object(3)
memory usage: 70.4+ KB
hb2.head(6)

 编号申请签字时间申请签证周当前雇主的雇佣期限就业岗位就业状况主要工作收入收入总额工作经验
00124UpTo5YearsWorker3.01000100015To25Years
12142MoreThan5YearsSpecialistOfficeWorker3.063363315To25Years
23224MoreThan5YearsOwner5.0550550MoreThan25Years
34153MoreThan5YearsWorker3.08338335To10Years
45103MoreThan5YearsWorker3.03413415To10Years
56144UpTo1YearWorker3.0430430LessThan2Years
hb3.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 899 entries, 0 to 898
Data columns (total 12 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   编号      899 non-null    int64  
 1   状态      899 non-null    object 
 2   金额      899 non-null    float64
 3   现有负债    899 non-null    int64  
 4   贷款日期    899 non-null    object 
 5   贷款期限    899 non-null    int64  
 6   新信用客户   899 non-null    bool   
 7   贷前贷款数   899 non-null    int64  
 8   占用区     859 non-null    float64
 9   贷款用途    899 non-null    int64  
 10  先前得分    763 non-null    float64
 11  违约      899 non-null    bool   
dtypes: bool(2), float64(3), int64(5), object(2)
memory usage: 72.1+ KB
hb3.head()

 编号状态金额现有负债贷款日期贷款期限新信用客户贷前贷款数占用区贷款用途先前得分违约
00Current5000.0905/05/201560False18.000.0957False
12Repaid530.0719/10/201560True01.020.1034False
23Current5500.0102/09/201560True013.020.0772False
34Repaid6900.01020/05/201560False119.070.0773False
45Current2655.0629/12/201560True017.020.1898False
data2 = pd.merge(hb1,hb2,how='outer')
data2
 编号城市国家出生日期教育程度性别房屋所有权类型婚姻状况申请签字时间申请签证周当前雇主的雇佣期限就业岗位就业状况主要工作收入收入总额工作经验
00AESPAEE21/11/1975406.04124UpTo5YearsWorker3.01000100015To25Years
12P脛RNUEE25/10/1969419.01142MoreThan5YearsSpecialistOfficeWorker3.063363315To25Years
23TALLINNEE22/11/1965401.04224MoreThan5YearsOwner5.0550550MoreThan25Years
34KEHTNAEE05/12/1983201.03153MoreThan5YearsWorker3.08338335To10Years
45KIVI脮LIEE13/07/1980414.03103MoreThan5YearsWorker3.03413415To10Years
...................................................
9941257P脛RISPEAEE08/04/197130NaN3195UpTo2Yearsvalvur3.03820845210To15Years
9951258TALLINNEE29/11/194941NaN5136UpTo4Yearsklienditeenindaja3.090009000MoreThan25Years
9961259UUEM脮ISAEE21/02/197941NaN1171UpTo1YearNoorem referent3.07200750010To15Years
9971260TARTUEE21/10/198351NaN3167NaNadministraator3.06500105002To5Years
9981261VILJANDIEE30/08/197711NaN2217MoreThan5YearsNaN3.08000830010To15Years

999 rows × 16 columns

</div>

4.透视表

shuju = pd.read_csv('table.csv')
shuju.head()
 SchoolClassIDGenderAddressHeightWeightMathPhysics
0S_1C_11101Mstreet_11736334.0A+
1S_1C_11102Fstreet_21927332.5B+
2S_1C_11103Mstreet_21868287.2B+
3S_1C_11104Fstreet_21678180.4B-
4S_1C_11105Fstreet_41596484.8B+

</div>

pivot_table

pd.pivot_table(shuju,index='ID',columns='Gender',values='Height').head()
GenderFM
ID  
1101NaN173.0
1102192.0NaN
1103NaN186.0
1104167.0NaN
1105159.0NaN

四个参数

pd.pivot_table(shuju,index='Gender',columns='School',values='Height',aggfunc=['mean','sum'])

 meansum
SchoolS_1S_2S_1S_2
Gender    
F173.125000173.72727313851911
M178.714286172.00000012511548
pd.pivot_table(shuju,index=['School','Class'],columns=['Gender','Address'],values=['Height','Weight'])
  Height...Weight
 GenderFM...FM
 Addressstreet_1street_2street_4street_5street_6street_7street_1street_2street_4street_5...street_4street_5street_6street_7street_1street_2street_4street_5street_6street_7
SchoolClass                     
S_1C_1NaN179.5159.0NaNNaNNaN173.0186.0NaNNaN...64.0NaNNaNNaN63.082.0NaNNaNNaNNaN
C_2NaNNaN176.0162.0167.0NaNNaNNaNNaN188.0...94.063.063.0NaNNaNNaNNaN68.053.0NaN
C_3175.0NaNNaN187.0NaNNaNNaN195.0161.0NaN...NaN69.0NaNNaNNaN70.068.0NaNNaN82.0
S_2C_1NaNNaNNaN159.0161.0NaNNaNNaN163.5NaN...NaN97.061.0NaNNaNNaN71.0NaNNaN84.0
C_2NaNNaNNaNNaNNaN188.5175.0NaN155.0193.0...NaNNaNNaN76.574.0NaN91.0100.0NaNNaN
C_3NaNNaN157.0NaN164.0190.0NaNNaN187.0171.0...78.0NaN81.099.0NaNNaN73.088.0NaNNaN
C_4NaN176.0NaNNaN175.5NaNNaNNaNNaNNaN...NaNNaN57.0NaNNaNNaNNaNNaNNaN82.0

7 rows × 24 columns

有关3.5.4 分组、合并、透视表的更多相关文章

  1. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  2. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  3. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  4. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  5. Ruby 哈希直接访问与合并 - 2

    有什么区别:@attr[:field]=new_value和@attr.merge(:field=>new_value) 最佳答案 如果您使用的是merge!而不是merge,则没有区别。唯一的区别是您可以在合并参数中使用多个字段(意思是:另一个散列)。例子:h1={"a"=>100,"b"=>200}h2={"b"=>254,"c"=>300}h3=h1.merge(h2)putsh1#=>{"a"=>100,"b"=>200}putsh3#=>{"a"=>100,"b"=>254,"c"=>300}h1.merge!(h2)pu

  6. arrays - 如何在下面的示例中将两个值数组分组为 n 个值数组? - 2

    我已经有很多两个值数组,例如下面的例子ary=[[1,2],[2,3],[1,3],[4,5],[5,6],[4,7],[7,8],[4,8]]我想把它们分组到[1,2,3],[4,5],[5,6],[4,7,8]因为意思是1和2有关系,2和3有关系,1和3有关系,所以1,2,3都有关系我如何通过ruby​​库或任何算法来做到这一点? 最佳答案 这是基本Bron–Kerboschalgorithm的Ruby实现:classGraphdefinitialize(edges)@edges=edgesenddeffind_maximum_

  7. ruby - 如何将相同的相邻数字分组 - 2

    如果至少有两个相邻的数字相同,格式为,我需要打包.这是我的输入:[2,2,2,3,4,3,3,2,4,4,5]以及预期的输出:"2:3,3,4,3:2,2,4:2,5"到目前为止我试过:a=[1,1,1,2,2,3,2,3,4,4,5]a.each_cons(2).any?do|s,t|ifs==t如果相等,也许可以尝试计数器,但那是行不通的。 最佳答案 您可以使用Enumerable#chunk_while(如果你使用的是Ruby>=2.3):a.chunk_while{|a,b|a==b}.flat_map{|chunk|chu

  8. ruby - 在两个 ActiveRecord 类之间合并/复制属性的好方法? - 2

    之前有人问过这个问题,我发现了以下clip关于如何一次设置一个类对象的所有属性,但由于批量分配保护,这在Rails中是不可能的。(例如,您不能Object.attributes={})有没有一种很好的方法可以将一个类的属性合并到另一个类中?object1.attributes=object2.attributes.inject({}){|h,(k,v)|h[k]=vifObjectModel.column_names.include?(k);h}谢谢。 最佳答案 利用assign_attributes使用:without_prote

  9. ruby - 合并 nanoc 中的项目 - 2

    我一直在尝试使用nanoc用于生成静态网站。我需要组织一个复杂的排列页面,我想让我的内容保持干燥。包含或合并的概念在nanoc系统中如何运作?我已阅读文档,但似乎找不到我想要的内容。例如:我如何获取两个部分内容项并将它们合并到一个新的内容项中。在staticmatic您可以在您的页面中执行以下操作。=partial('partials/shared/navigation')类似的约定在nanoc中如何运作? 最佳答案 这里是nanoc的作者。在nanoc中,部分是布局。因此,您可以拥有layouts/partials/shared/

  10. ruby - 如何在 Ruby 中将数字分组到不同的桶中 - 2

    我有一个文件,每一行都有数字:010110101311010113114311010431420我想要一个包含每个数字出现次数的散列,在这种情况下:{0101=>2,1010=>2,1311=>2,431=>2,420=>1}我该怎么做? 最佳答案 简单的一行代码,给定一个数组items:items.inject(Hash.new(0)){|hash,item|hash[item]+=1;hash}工作原理:Hash.new(0)创建一个新的Hash,其中访问未定义的键返回0。inject(foo)使用给定的block遍历数组。对于

随机推荐