第1关:Series数据选择
任务描述
本关任务:根据相关知识,得到目标Series
对象,具体要求请查看编程要求。
相关知识
Series
对象与一维Numpy
数组和标准Python
字典在许多方面都一样。所以,Series
对象的数据索引和选择模式与以上两种数据结构类似。
Series数据选择方法
与Python
中的字典一样,Series
对象提供了键值对的映射。
In: import pandas as pd
In: data = pd.Series([0.25, 0.5, 0.75, 1.0], index=['a', 'b', 'c', 'd'])
In: data["b"]
Out: 0.5
还可以用Python
字典的表达式和方法来检测键/索引和值,也可以像字典一样来修改Series
对象的值。
In: "a" in data
Out: True
In: data.keys()
Out: Index(['a', 'b', 'c', 'd'], dtype='object')
In: list(data.items())
Out: [('a', 0.25), ('b', 0.5), ('c', 0.75), ('d', 1.0)]
In: data["b"] = 0.05 # 也可以通过此方法来扩展Series
In: data
Out: a 0.25
b 0.05
c 0.75
d 1.00
dtype: float64
Series
对象的可变性是一个非常方便的特性:Pandas
在底层已经为可能发生的内存布局和数据复制自动决策,用户不需要担心这些问题。
将Series看作一堆数组
Series
对象还具备和Numpy
数组一样的数组数据选择功能,包括索引、掩码、花哨索引等操作,具体示例如下所示:
-
将显示索引作为切片:
注意:显示索引切片结果包含最后一个索引,也就是能取到“c”的值。
In: data['a':'c']
Out: a 0.25
b 0.50
c 0.75
dtype: float64
-
将隐式整数索引作为切片:
注意:隐式索引切片结果不包含最后一个索引。
In: data[0:2]
Out: a 0.25
b 0.50
dtype: float64
-
掩码:
In: data[(data > 0.3) & (data < 0.8)]
Out: b 0.50
c 0.75
dtype: float64
-
花哨的索引:
In: data[["a","e"]]
Out: a 0.25
e 1.25
dtype: float64
索引器:loc和iloc
这些切片和取值操作非常混乱,假如Series
对象索引序列为整数时,data[2]
不会取第三行,而是取索引序列为2
的那一行,也就是说会优先使用显示索引,而data[1:3]
这样的切片操作会优先使用隐式索引。
In: data = pd.Series(['a', 'b', 'c'], index=[1, 3, 5])
In: data[1]
Out: "a"
In: data[0:2]
Out: 1 a
3 b
dtype: object
正是应为这些整数索引很容易造成混淆,所以Pandas
提供了一些 索引器(indexer) 属性来作为取值的方法。它们不是Series
对象的函数方法,而是暴露切片接口的属性。
loc
属性:表示取值和切片都是显式的;In: data.loc[1]
Out: "a"
In: data.loc[1:3]
Out: 1 a
3 b
dtype: object
iloc
属性:表示取值和切片都是Python
形式的隐式索引;In: data.iloc[1]
Out: "b"
In: data.iloc[1:3]
Out: 3 b
5 c
dtype: object
Python
代码的设计原则之一式“显示优于隐式”。使用loc
和iloc
可以让代码更容易维护,可读性更高。特别是在处理整数索引的对象时,我强烈推荐使用这两种索引器。它们既可以让代码阅读和理解起来更容易,也能避免因误用索引或者切片而产生的小bug
。
编程要求
本关的编程任务是补全右侧上部代码编辑区内的相应代码,要求实现如下功能:
- 添加一行数据,时间戳
2019-01-29
值为320
; - 获取
2019-01-04
号之后的数据(包含该日期); - 最后筛选值大于
100
的数据,得到以下目标Series
对象;2019-01-06 981
2019-01-11 647
2019-01-17 198
2019-01-20 1698
2019-01-21 7496
2019-01-24 8201
2019-01-29 320
dtype: int64
- 具体要求请参见后续测试样例。
提示:使用to_datetime()函数可以将字符串转换成时间戳。
pd.to_datetime('2019-01-01')
请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作!
测试说明
平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。
测试输入:
np.array([4,9,4,3,1,981,13,6,46,1,647,64,31,46,46,13,198,76,13,1698,7496,2,100,8201,30])
预期输出:
2019-01-06 981
2019-01-11 647
2019-01-17 198
2019-01-20 1698
2019-01-21 7496
2019-01-24 8201
2019-01-29 320
dtype: int64
实现代码:
import pandas as pd
import numpy as np
arr = input()
dates = pd.date_range('20190101', periods=25) # 生成时间序列
df = pd.Series(eval(arr),index=dates)
#完成编程要求,并输出结果
#********** Begin **********#
a=pd.to_datetime('2019-01-29')
b=pd.to_datetime('2019-01-04')
df[a]=320
dh=df[b:]
print(dh[dh>100])
#********** End **********
第1关:Series数据选择
任务描述
本关任务:根据相关知识,得到目标Series
对象,具体要求请查看编程要求。
相关知识
Series
对象与一维Numpy
数组和标准Python
字典在许多方面都一样。所以,Series
对象的数据索引和选择模式与以上两种数据结构类似。
Series数据选择方法
与Python
中的字典一样,Series
对象提供了键值对的映射。
In: import pandas as pd
In: data = pd.Series([0.25, 0.5, 0.75, 1.0], index=['a', 'b', 'c', 'd'])
In: data["b"]
Out: 0.5
还可以用Python
字典的表达式和方法来检测键/索引和值,也可以像字典一样来修改Series
对象的值。
In: "a" in data
Out: True
In: data.keys()
Out: Index(['a', 'b', 'c', 'd'], dtype='object')
In: list(data.items())
Out: [('a', 0.25), ('b', 0.5), ('c', 0.75), ('d', 1.0)]
In: data["b"] = 0.05 # 也可以通过此方法来扩展Series
In: data
Out: a 0.25
b 0.05
c 0.75
d 1.00
dtype: float64
Series
对象的可变性是一个非常方便的特性:Pandas
在底层已经为可能发生的内存布局和数据复制自动决策,用户不需要担心这些问题。
将Series看作一堆数组
Series
对象还具备和Numpy
数组一样的数组数据选择功能,包括索引、掩码、花哨索引等操作,具体示例如下所示:
-
将显示索引作为切片:
注意:显示索引切片结果包含最后一个索引,也就是能取到“c”的值。
In: data['a':'c']
Out: a 0.25
b 0.50
c 0.75
dtype: float64
-
将隐式整数索引作为切片:
注意:隐式索引切片结果不包含最后一个索引。
In: data[0:2]
Out: a 0.25
b 0.50
dtype: float64
-
掩码:
In: data[(data > 0.3) & (data < 0.8)]
Out: b 0.50
c 0.75
dtype: float64
-
花哨的索引:
In: data[["a","e"]]
Out: a 0.25
e 1.25
dtype: float64
索引器:loc和iloc
这些切片和取值操作非常混乱,假如Series
对象索引序列为整数时,data[2]
不会取第三行,而是取索引序列为2
的那一行,也就是说会优先使用显示索引,而data[1:3]
这样的切片操作会优先使用隐式索引。
In: data = pd.Series(['a', 'b', 'c'], index=[1, 3, 5])
In: data[1]
Out: "a"
In: data[0:2]
Out: 1 a
3 b
dtype: object
正是应为这些整数索引很容易造成混淆,所以Pandas
提供了一些 索引器(indexer) 属性来作为取值的方法。它们不是Series
对象的函数方法,而是暴露切片接口的属性。
loc
属性:表示取值和切片都是显式的;In: data.loc[1]
Out: "a"
In: data.loc[1:3]
Out: 1 a
3 b
dtype: object
iloc
属性:表示取值和切片都是Python
形式的隐式索引;In: data.iloc[1]
Out: "b"
In: data.iloc[1:3]
Out: 3 b
5 c
dtype: object
Python
代码的设计原则之一式“显示优于隐式”。使用loc
和iloc
可以让代码更容易维护,可读性更高。特别是在处理整数索引的对象时,我强烈推荐使用这两种索引器。它们既可以让代码阅读和理解起来更容易,也能避免因误用索引或者切片而产生的小bug
。
编程要求
本关的编程任务是补全右侧上部代码编辑区内的相应代码,要求实现如下功能:
- 添加一行数据,时间戳
2019-01-29
值为320
; - 获取
2019-01-04
号之后的数据(包含该日期); - 最后筛选值大于
100
的数据,得到以下目标Series
对象;2019-01-06 981
2019-01-11 647
2019-01-17 198
2019-01-20 1698
2019-01-21 7496
2019-01-24 8201
2019-01-29 320
dtype: int64
- 具体要求请参见后续测试样例。
提示:使用to_datetime()函数可以将字符串转换成时间戳。
pd.to_datetime('2019-01-01')
请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作!
测试说明
平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。
测试输入:
np.array([4,9,4,3,1,981,13,6,46,1,647,64,31,46,46,13,198,76,13,1698,7496,2,100,8201,30])
预期输出:
2019-01-06 981
2019-01-11 647
2019-01-17 198
2019-01-20 1698
2019-01-21 7496
2019-01-24 8201
2019-01-29 320
dtype: int64
实现代码:
import pandas as pd
import numpy as np
arr = input()
dates = pd.date_range('20190101', periods=25) # 生成时间序列
df = pd.Series(eval(arr),index=dates)
#完成编程要求,并输出结果
#********** Begin **********#
a=pd.to_datetime('2019-01-29')
b=pd.to_datetime('2019-01-04')
df[a]=320
dh=df[b:]
print(dh[dh>100])
#********** End **********