任务描述
本关任务:通过相关知识介绍的取值方法,得到目标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 423967
Florida 170312
Illinois 149995
New York 141297
Texas 695662
Name: 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: data
Out: area pop density
California 423967 38332521 90.413926
Florida 170312 19552860 114.806121
Illinois 149995 12882135 85.883763
New York 141297 19651127 139.076746
Texas 695662 26448193 38.018740
将DataFrame看作二维数组
DataFrame
可以看成是一个增强版的二维数组,许多数组 *** 作方式都可以用在DataFrame
对象上,例如,用values
属性按行查看数组数据,对DataFrame
进行转置等等。
In: data.values
Out:
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.T
Out:
将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 pop
Florida 170312 19552860
Illinois 149995 12882135
In: data.loc[:'Illinois', :'pop'] #显式
Out: area pop
California 423967 38332521
Florida 170312 19552860
Illinois 149995 12882135
任何用于处理NumPy
形式数据的方法都可以用于这些索引器,例如在loc
索引器中结合使用掩码与花哨索引方法。
In: data.loc[data.density > 100, ['pop', 'density']]
Out: pop density
Florida 19552860 114.806121
New 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 Washington
deaths 616 62
deserters 2 31
readiness 3 3
regiment Nighthawks Dragoons
size 1400 849
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)