目录
一、python中的各种序列/容器指哪些?
二、如何取用list列表中的元素?
三、如何取用tuple元组中的元素?
四、如何取用ndarray数组中的元素?
五、如何取用dict字典中的元素?
六、如何取用pandas.Serise中的元素?
七、如何取用pandas.Dataframe中的元素?
八、总结
九、参考来源
list(列表)、tuple(元组)、ndarray(数组)、dict(字典)、pandas.Series、pandas.Dataframe,等等。
本文强调的是python中所有容器中元素的取用方法,并重点强调多维索引,对「切片」的知识讲解较少。
a=[[1,2,3],[4,5,6]]
# 取出列表a中的一个元素
print(a[1][1]) #对多维列表的索引,应该用多个并排的中括号
print(a[1,1])
#出错误了,TypeError: list indices must be integers or slices, not tuple
print('列表的子内容{0[1,1]}'.format([[1,2],[1,2]]))
#出错误了,TypeError: list indices must be integers or slices, not str
a = ((1,2,3),(4,5,6))
a[1][1] #和列表一样,都是用多个中括号,一个中括号只能放一个维度的索引值
# 输出5
import numpy as np
# 1、生成数据并打印
a = np.round(np.random.rand(3,3)*10)
print(a)
# a = [[3. 5. 3.]
# [5. 7. 9.]
# [9. 9. 6.]]
# 2、两种基本索引用法
print(a[1,1]) # 常规用法是用逗号分隔各个维度的索引
# 输出为7
print(a[1][1]) # 兼容python的语法,用多个中括号隔开也可以
# 输出为7
# 3、数组的切片用法
print(a[1:3])
# a[1:3]=[[5. 7. 9.]
# [9. 9. 6.]]
a[1:3][0] # 相当于(a[1:3])[0] ,也即把a[1:3]看成一个整体
# 输出为[5. 7. 9.]
a[1:3][1]
# 输出为[9. 9. 6.]
# 4、数组的离散坐标索引用法
print(a[[1],[1]]) # 输出为[7.]
print(a[[1,2],[1]]) # 输出为[7. 9.],而不是[[7,],[9.]],说明用这种方法输出的都是一维数组
print(a[[1,2],[1,1]]) # 输出和上面的print(a[[1,2],[1]])一样,说明对后面的[1]进行了broadcast补全
print(a[[1,2],[1,2]]) # 输出为[7. 6.]
# 5、数组索引也可以用包括布尔类型成员的ndarray类型数组
arr = np.array([[1, np.nan, 3], [np.nan, 5, np.nan]])
print(arr[np.isnan(arr)]) # 输出为[np.nan, np.nan, np.nan],该行代码等效于下一行代码
print(arr[np.array([[False, True, False],[True, False, True]])]) # 输出为[np.nan, np.nan, np.nan]
dict_2d = {'a': {'a': 1, 'b': 3}, 'b': {'a': 6}}
print(dict_2d['a']['b']) # 对字典,可以用键来索引其value
# 输出为3
import numpy as np
import pandas as pd
e = pd.Series(data=[1,2,3,4,5],index=['zero','one','two','three','four'])
print(e[1]) # 利用序号来取出Series中的值
print(e['one']) # 利用索引字符串来取出Series中的值
print(e[np.array([False,True,False,False,False])]) # 利用元素是布尔类型的ndarray取出目标项
# 输出结果
# 2
# 2
# one 2
# dtype: int64
这一部分,我主要参考了 https://blog.csdn.net/wei_lin/article/details/93492252 的内容。
此外,我再补充几点,总结在下面的补充性表格上了。
序号 | 代码 | 描述 |
1 | DataFrame() | (1)可利用列表、字典、元组等序列生成dataframe类型数据; (2)有哪些利用DataFrame()生成dataframe数据的方法? ①对于二维n*m形状的列表,生成n行m列的dataframe;索引默认取和序号相同的数。 ②对于有m个key值的字典,如果每一个key值仅指向一个scalar(单独的数值,而不是列表、元组这种序列),那么就是在生成包括一行元素的dataframe数据;此时必须指定行索引,不然会报错,比如df=pd.DataFrame({'a':1,'b':2,'c':3},index=[row_index]) ③对于有m个key值的字典,每个key值若指向一维长度为n的列表,则生成n行m列的dataframe,列索引columns与key逐一对应。 ④对于有m个key值的字典,每个key值若指向一个字典,不同子字典包括有相同的subkey值,则这些key值对应列索引、subkey值对应行索引。比如df={'one':{'a':1,'b':2,'c':3},'two':{'a':5,'b':6,'c':7},'three':{'a':9,'b':10,'c':11}}。 (3)同“read_csv()”进行比较。 ①相似点:都可生成一个dataframe类型数据; ②不同点:如果csv文件只有1列,那么read_csv()只生成series类型数据;read_csv()可以在生成dataframe数据的同时对列名进行描述,比如df = pd.read_csv('xxx.csv', names=new_columns), |
2 | df.T | 对原Dataframe进行“转置” |
3 | df.rename | 对行索引或列索引进行更改(重命名、更改大小写、添加前后缀等)。 (1)主要参数意义:columns:列名;index:行名;axis:指定坐标轴;inplace:是否替换,默认为False。inplace为False时返回修改后结果,变量自身不修改。inplace为True时返回None,变量自身被修改。记忆技巧:in place of翻译过来表示替代,如果替代是True,那么原数据自然被修改。 (2)不用axis参数: ①仅修改列索引df.rename(columns={"A": "a", "B": "c"}) ②仅修改行索引df.rename(index={0:"0a",1:"1a"}) ③同时修改行、列索引df.rename(columns={"A": "a", "B": "c"},index={0:"0a",1:"1a"}) (3)使用axis参数 ①mapper参数为一个字典时,则对行索引或列索引进行“指名道姓”式地重命名,df.rename({"A": "a", "B": "c"}, axis=columns) ②mapper参数为一个函数时,则以行索引列索引为参数调用该函数,比如设置所有列索引为小写,df.rename(str.lower, axis='columns') ③从上面2个解释易得,使用axis参数时只能要么修改行索引、要么修改列索引 (4)使用inplace参数,不保留原数据df.rename(columns={"A": "a", "B": "c"},inplace=True) |
4 | df.values | 返回dataframe中所有值(index和columns属于标签索引) |
5 | df.index | 获取dataframe中的行标签/行索引;右边加赋值表达式,可以对行索引进行修改,比如df.index = ['zhangming', 'lihua', 'wangcuihua', 'qintian'];注意等式左右两边长度必须相同,因此必须对全部的行索引进行重命名 |
6 | df.columns | 获取dataframe中的列标签/列索引;右边加赋值表达式,可以对列索引进行修改,比如df.columns = ['name', 'sexuality', 'age'];注意等式左右两边长度必须相同,因此必须对全部的列索引进行重命名 |
7 | df.axes | 获取dataframe中的行索引和列索引;不能用axes属性来为行(列)索引赋值,或者作出改变 |
8 | df.index.str | 将行索引的index类型(pandas.core.indexes.base.Index)转换为str类型(pandas.core.strings.accessor.StringMethods);怎么用呢?搭配str的replace属性方法,来根据规则批量修改索引,假如原行索引为['a1',b1','c1'],当执行df.index.str.replace('1', '2')时,就可以将原来所有行索引中的1替换成2,也即['a2',b2','c2']。 |
9 | df["index_name"]或 df["columns_name"] |
df["index_name"]和df["columns_name"]都能返回某一行/列元素,类型是Dataframe;而如果想要返回某几行/列元素(可不连续),可以参考下面同级的第(3)部分的第3.2小节。 |
10 | df.columns_name | columns_name是某一列的列索引,调用这个属性可以返回某一列元素,返回类型是Series;注意不能用df.index_name来取用某一行。 |
11 | df.iloc[行序号, 列序号] | 调取行、列序号值指定的元素,注意这里返回的是单个元素。df.iloc[行序号,列序号]和df.loc[行序号][列序号]等价,都是用序号来调用某元素。说明loc属性也能用序号进行索引。 |
12 | df.loc[行索引, 列索引] | 调取行、列索引(标签)指定的元素,注意这里返回的是单个元素。参见上文的ndarray数组元素的第4部分(数组的离散坐标索引用法),Dataframe类型也支持这种方法,用来索引独特的几行/几列元素(或不连续的元素)。 |
(1)利用索引字符串来取元素,不仅可以用上图的df.loc[行索引,列索引]的方法,也可以类似series对象那样直接取;df["index_name"]和df["columns_name"]都能返回某一行/列元素,类型是Dataframe;而如果想要返回某几行/列元素(可不连续),可以参考同级的第(3)部分的第3.2小节。
(2)df.iloc[行序号,列序号]和df.loc[行序号][列序号]等价,都是用序号来调用某元素。说明loc属性也能用序号进行索引。
(3)参见上文的ndarray数组元素的第4部分(数组的离散坐标索引用法),Dataframe类型也支持这种方法,用来索引独特的几行/几列元素(或不连续的元素)。
import pandas as pd
# 0、生成字典数据
data = {
"calories": [420, 380, 390],
"duration": [50, 40, 45],"ID": [1, 2, 3]
}
# calories duration
# 0 420 50
# 1 380 40
# 2 390 45
# 1、转化成Dataframe对象
df3 = pd.DataFrame(data)
# 2、取出坐标为(0,0)和(1,0)的元素,返回结果为series类型
df3.loc[[0, 1][0]]
# calories 420
# duration 50
# ID 1
# Name: 0, dtype: int64
type(df3.loc[[0, 1][0]]) # pandas.core.series.Series
# 3、索引某几行/列,返回结果依旧Dataframe
# 3.1 利用序号取出第0、1行
df3.loc[[0, 1]]
# calories duration ID
# 0 420 50 1
# 1 380 40 2
type(df3.loc[[0, 1]]) # pandas.core.frame.DataFrame
# 3.2 利用索引取出第0,3列
df3[['calories','ID']]
# calories ID
# 0 420 1
# 1 380 2
# 2 390 3
type(df3[['calories','ID']]) # pandas.core.frame.DataFrame
可见,除了ndarray是用逗号分隔各个维度下的索引数据,其他的类似list、tuple、dict等序列都是用多个中括号来分别装载各个维度的索引数。
可能是因为,ndarray不是python的原生数据类型。
Python tuple元组详解-C语言中文网
pandas详解(Series篇)_CHenXoo的博客-CSDN博客_pandas中的series
Pandas DataFrame的基本属性详解_wei_lin的博客-CSDN博客_pd.dataframe