
任务描述
本关任务:通过相关知识介绍的取值方法,得到目标DataFrame对象,具体要求请查看编程要求。
相关知识
将DataFrame看作字典
DataFrame可以看作一个由若干Series对象构成的字典,可以通过对列名进行字典形式的取值获取数据。
In: area = pd.Series({'California': 423967, 'Texas': 695662, 'New York': 141297, 'Florida': 170312, 'Illinois': 149995})In: pop = pd.Series({'California': 38332521, 'Texas': 26448193, 'New York': 19651127, 'Florida': 19552860, 'Illinois': 12882135})In: data = pd.DataFrame({'area':area, 'pop':pop})In: data["area"] # data.area 这种属性形式也可以获取到相同的结果Out: California 423967Florida 170312Illinois 149995New York 141297Texas 695662Name: area, dtype: int64
虽然属性形式的数据选择方法很方便,但是它并不是通用的。如果列名不是纯字符串,或者列名与DataFrame的方法同名,那么就不能用属性索引。例如,DataFrame有一个pop()方法,如果用data.pop就不会获取'pop'列,而是显示为方法。
In: data.pop is data['pop']Out: False
所以,尽量避免用属性形式选择的列直接赋值,即避免data.pop=z这种方式赋值。
和Series对象一样,可以用字典形式的语法调整对象,例如增加一列数据。
In: data["density"] = data['pop']/data['area']In: dataOut: area pop densityCalifornia 423967 38332521 90.413926Florida 170312 19552860 114.806121Illinois 149995 12882135 85.883763New York 141297 19651127 139.076746Texas 695662 26448193 38.018740
将DataFrame看作二维数组
DataFrame可以看成是一个增强版的二维数组,许多数组 *** 作方式都可以用在DataFrame对象上,例如,用values属性按行查看数组数据,对DataFrame进行转置等等。
In: data.valuesOut:array([[ 4.23967000e+05, 3.83325210e+07, 9.04139261e+01],[ 1.70312000e+05, 1.95528600e+07, 1.14806121e+02],[ 1.49995000e+05, 1.28821350e+07, 8.58837628e+01],[ 1.41297000e+05, 1.96511270e+07, 1.39076746e+02],[ 6.95662000e+05, 2.64481930e+07, 3.80187404e+01]])In: data.TOut:
将DataFrame看作数组时,我们可以是使用单个行索引获取一行数据。
In: data.values[0] #取一行数据Out: array([ 4.23967000e+05, 3.83325210e+07, 9.04139261e+01])
而获取一列数据就需要向DataFrame传递单个列索引,与字典形式的 *** 作相同,都是用data["列名"]获取。
因此,在进行数组形式的取值时,我们就需要用另一种方法——前面介绍过的Pandas索引器loc、iloc和ix了。通过iloc索引器,我们就可以像对待NumPy数组一样索引Pandas的底层数组(Python的隐式索引),DataFrame的行列标签会自动保留在结果中。
In: data.iloc[1:3, :2] # 隐式Out: area popFlorida 170312 19552860Illinois 149995 12882135In: data.loc[:'Illinois', :'pop'] #显式Out: area popCalifornia 423967 38332521Florida 170312 19552860Illinois 149995 12882135
任何用于处理NumPy形式数据的方法都可以用于这些索引器,例如在loc索引器中结合使用掩码与花哨索引方法。
In: data.loc[data.density > 100, ['pop', 'density']]Out: pop densityFlorida 19552860 114.806121New York 19651127 139.076746
其他取值方法
还有一些取值方法和前面介绍过的方法不太一样,但是在实际应用中非常实用。
data["列名"]data["A列":"B列"]data[0:3] # 取第一到第四行data[data.density > 100] #取density列值大于100的行
编程要求
本关的编程任务是补全右侧上部代码编辑区内的相应代码,要求实现如下功能:
- 完成下列要求。初始
DataFrame如图所示:
- 根据相关知识介绍的取值方法将初始
DataFrame转换成下图所示DataFrame,并输出:
| Florida | Washington | |
|---|---|---|
| deaths | 616 | 62 |
| deserters | 2 | 31 |
| readiness | 3 | 3 |
| regiment | Nighthawks | Dragoons |
| size | 1400 | 849 |
| veterans | 26 | 48 |
- 具体要求请参见后续测试样例。
请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作!
测试说明
平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。
测试输入:无测试输入
预期输出:
Florida Washingtondeaths 616 62deserters 2 31readiness 3 3regiment Nighthawks Dragoonssize 1400 849veterans 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
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)