目录

一、python中的各种序列/容器指哪些?

二、如何取用list列表中的元素?

三、如何取用tuple元组中的元素?

四、如何取用ndarray数组中的元素?

五、如何取用dict字典中的元素?

六、如何取用pandas.Serise中的元素?

七、如何取用pandas.Dataframe中的元素?

八、总结

九、参考来源



一、python中的各种序列/容器指哪些?

list(列表)、tuple(元组)、ndarray(数组)、dict(字典)、pandas.Series、pandas.Dataframe,等等。

本文强调的是python中所有容器中元素的取用方法,并重点强调多维索引,对「切片」的知识讲解较少。

二、如何取用list列表中的元素?

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

三、如何取用tuple元组中的元素?

a = ((1,2,3),(4,5,6))
a[1][1] #和列表一样,都是用多个中括号,一个中括号只能放一个维度的索引值
# 输出5

四、如何取用ndarray数组中的元素?

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字典中的元素?

dict_2d = {'a': {'a': 1, 'b': 3}, 'b': {'a': 6}}
print(dict_2d['a']['b'])  # 对字典,可以用键来索引其value
# 输出为3

六、如何取用pandas.Serise中的元素?

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

七、如何取用pandas.Dataframe中的元素?

这一部分,我主要参考了  的内容。

此外,我再补充几点,总结在下面的补充性表格上了。

序号

代码

描述

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的原生数据类型。