第2关:DataFrame数据选择方法

第2关:DataFrame数据选择方法,第1张

任务描述

本关任务:通过相关知识介绍的取值方法,得到目标DataFrame对象,具体要求请查看编程要求。

相关知识

将DataFrame看作字典

DataFrame可以看作一个由若干Series对象构成的字典,可以通过对列名进行字典形式的取值获取数据。

 
  1. In: area = pd.Series({'California': 423967, 'Texas': 695662, 'New York': 141297, 'Florida': 170312, 'Illinois': 149995})
  2. In: pop = pd.Series({'California': 38332521, 'Texas': 26448193, 'New York': 19651127, 'Florida': 19552860, 'Illinois': 12882135})
  3. In: data = pd.DataFrame({'area':area, 'pop':pop})
  4. In: data["area"] # data.area 这种属性形式也可以获取到相同的结果
  5. Out: California 423967
  6. Florida 170312
  7. Illinois 149995
  8. New York 141297
  9. Texas 695662
  10. Name: area, dtype: int64

虽然属性形式的数据选择方法很方便,但是它并不是通用的。如果列名不是纯字符串,或者列名与DataFrame的方法同名,那么就不能用属性索引。例如,DataFrame有一个pop()方法,如果用data.pop就不会获取'pop'列,而是显示为方法。

 
  1. In: data.pop is data['pop']
  2. Out: False

所以,尽量避免用属性形式选择的列直接赋值,即避免data.pop=z这种方式赋值。

Series对象一样,可以用字典形式的语法调整对象,例如增加一列数据。

 
  1. In: data["density"] = data['pop']/data['area']
  2. In: data
  3. Out: area pop density
  4. California 423967 38332521 90.413926
  5. Florida 170312 19552860 114.806121
  6. Illinois 149995 12882135 85.883763
  7. New York 141297 19651127 139.076746
  8. Texas 695662 26448193 38.018740

将DataFrame看作二维数组

DataFrame可以看成是一个增强版的二维数组,许多数组 *** 作方式都可以用在DataFrame对象上,例如,用values属性按行查看数组数据,对DataFrame进行转置等等。

 
  1. In: data.values
  2. Out:
  3. array(
  4. [[ 4.23967000e+05, 3.83325210e+07, 9.04139261e+01],
  5. [ 1.70312000e+05, 1.95528600e+07, 1.14806121e+02],
  6. [ 1.49995000e+05, 1.28821350e+07, 8.58837628e+01],
  7. [ 1.41297000e+05, 1.96511270e+07, 1.39076746e+02],
  8. [ 6.95662000e+05, 2.64481930e+07, 3.80187404e+01]])
  9. In: data.T
  10. Out:


DataFrame看作数组时,我们可以是使用单个行索引获取一行数据。

 
  1. In: data.values[0] #取一行数据
  2. Out: array([ 4.23967000e+05, 3.83325210e+07, 9.04139261e+01])

而获取一列数据就需要向DataFrame传递单个列索引,与字典形式的 *** 作相同,都是用data["列名"]获取。


因此,在进行数组形式的取值时,我们就需要用另一种方法——前面介绍过的Pandas索引器loc、ilocix了。通过iloc索引器,我们就可以像对待NumPy数组一样索引Pandas的底层数组(Python的隐式索引),DataFrame的行列标签会自动保留在结果中。

 
  1. In: data.iloc[1:3, :2] # 隐式
  2. Out: area pop
  3. Florida 170312 19552860
  4. Illinois 149995 12882135
  5. In: data.loc[:'Illinois', :'pop'] #显式
  6. Out: area pop
  7. California 423967 38332521
  8. Florida 170312 19552860
  9. Illinois 149995 12882135

任何用于处理NumPy形式数据的方法都可以用于这些索引器,例如在loc索引器中结合使用掩码与花哨索引方法。

 
  1. In: data.loc[data.density > 100, ['pop', 'density']]
  2. Out: pop density
  3. Florida 19552860 114.806121
  4. New York 19651127 139.076746

其他取值方法

还有一些取值方法和前面介绍过的方法不太一样,但是在实际应用中非常实用。

 
  1. data["列名"]
  2. data["A列":"B列"]
  3. data[0:3] # 取第一到第四行
  4. data[data.density > 100] #取density列值大于100的行

编程要求

本关的编程任务是补全右侧上部代码编辑区内的相应代码,要求实现如下功能:

  • 完成下列要求。初始DataFrame如图所示:

  • 根据相关知识介绍的取值方法将初始DataFrame转换成下图所示DataFrame,并输出:
FloridaWashington
deaths61662
deserters231
readiness33
regimentNighthawksDragoons
size1400849
veterans2648
  • 具体要求请参见后续测试样例。

请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作!

测试说明

平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。

测试输入:
无测试输入

预期输出:

 
  1. Florida Washington
  2. deaths 616 62
  3. deserters 2 31
  4. readiness 3 3
  5. regiment Nighthawks Dragoons
  6. size 1400 849
  7. veterans 26 48

实现代码:

import pandas as pd


 

def demo(raw_data,origin):

    df = pd.DataFrame(raw_data,index=origin)

    #转换成编程要求所示DataFrame, 并输出

    #********** Begin **********#

    dh=df[['deaths','deserters','readiness','regiment','size','veterans']]

    print(dh.iloc[[3,7]].T)


 

    #********** End **********#

    return

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/923234.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存