当前位置:   article > 正文

快醒醒,别睡了!...讲《数据分析pandas库》了—/—<4>

快醒醒,别睡了!...讲《数据分析pandas库》了—/—<4>

一、废话不多说,直接开讲

1、DataFrame的索引和切片

1.1 选择列

        当想要获取 df 中某列数据时,只需要在 df 后面的方括号中指明要选择的列即可。如果是 一列,则只需要传入一个列名;如果是同时选择多列,则传入多个列名即可(注意:多个列名 用一个 list 存放)

  1. #获取一列
  2. df[col]
  3. #获取多列
  4. df[[col1 , col2]]
        除了传入具体的列名,我们可以传入具体列的位置,即第几行,对数据进行选取,通过传
入位置来获取数据时需要用到 iloc 方法。即如下代码
df.iloc[,[0,2]]

1.2 按行列索引选择

        DataFrame对象按照行列检索获取,可以使用lociloc函数,方括号中逗号之前的部分表示要获取的的索引,如果输入一个冒号,或不输入任何数值表示获取所有的行或列,逗号之后方括号表示要获取的的索引。

  1. df.loc[普通行索引,普通列索引]
  2. df.iloc[位置行索引,位置列索引]

1.3 lociloc获取

看实例:

  1. import numpy as np
  2. import pandas as pd
  3. data=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('ABCD'))
  4. #获取行为'b'的行
  5. data.loc['b']
  6. #使用iloc获取,行为'b'的行,行号为1
  7. data.iloc[1]

其中首先用np生成一个一维数组,用reshape将其转变成3行4列的二维数组,在通过DsteFrame将其装换成类似于二维数组的列表,并更改行索引名为a、b、c,列索引为A、B、C、D,再将这段数组用date来接收,用loc来索引名为b的行,用iloc来索引数值为1的索引行,其打印结果相同,如下 :

                    

 获取'A'列所有行
  1. data.loc[:,'A']
  2. data.iloc[:,0]

逗号左右分别表示行和列,两行代码运行结果都一样

                        

 
• 获取部分行部分列:
  1. #获取a bc行,A B列
  2. data.loc[['a','b','c'],['A','B']]
  3. data.iloc[[0,1,2],[0,1]]

        上部分为获取行号为a,b,c,列号为A,B的结果,以及行索引值为0,1,2,列索引值为0,1的所对应的值 ,其所对应结果都一样

 获取满足条件的行:
  1. df[df[“支出”]>10]
  2. df[(df[“支出”]>10) & (df[“性别”]=='女')]

df[“支出”]>10为列‘支出’这一列中所对应的数值大于10的行,其返回的是布尔值,再用df将这个布尔值括起来即表示将布尔值为True的行打印出来

(df[“支出”]>10) & (df[“性别”]=='女') 这段则表示同时满足支出大于10,性别等于女的行。

2、isin()选择

         df.isin(values) 返回结果为相应的位置是否匹配给出的 values

        • values 为序列时:对应每个具体值

        •​​​​​​​ values 为字典时:对应各个变量名称

         •​​​​​​​  values 为数据框时:同时对应数值和变量名称 ​​​​​​​

  1. df.col.isin([1,3,5])
  2. df[ df.col.isin([1,3,5])]
  3. df[ df.col.isin(['val1','val2'])]
  4. df[ df.index.isin(['val1','val2'])]

df 是一个DataFrame对象。

col 是DataFrame中的一列(Series)。

.isin([1,3,5]) 是一个方法,用于判断col 中的元素是否包含在 [1,3,5] 这个列表中。

3、query()的使用

 使用boolean值表达式进行筛选

df.query( expr:语句表达式 inplace=False;是否直接替换原数据框 )

可以使用前缀“@”引用环境变量等号为==,而不是=  

expr是一个字符串,表示查询条件。查询条件可以使用DataFrame中的列名,并使用关系运算符和逻辑运算符进行比较和组合。

  1. import pandas as pd
  2. # 创建一个示例DataFrame
  3. data = {'A': [1, 2, 3, 4, 5],
  4. 'B': [6, 7, 8, 9, 10],
  5. 'C': [11, 12, 13, 14, 15]}
  6. df = pd.DataFrame(data)
  7. # 使用query函数进行查询
  8. result = df.query('A > 2') # 查询A列大于2的行
  9. print(result)
  10. result = df.query('A > 2 and B < 9') # 查询A列大于2且B列小于9的行
  11. print(result)

4、排序

4.1 按照索引进行排序

具体用法如下:

  1. df.sort_index(
  2. level :(多重索引时)指定用于排序的级别顺序号/名称18
  3. ascending = True :是否为升序排列,多列时以表形式提供
  4. inplace = False :
  5. na_position = 'last‘ :缺失值的排列顺序,
  6. first/last
  7. )
  8. df.sort_index(axis=0, ascending=True, inplace=False)

axis 参数表示排序的轴方向,可以是 0 或 1,默认值是 0,表示按行索引进行排序。

ascending 参数表示排序的顺序,可以是 True 或 False,默认值是 True,表示升序排序。

inplace 参数表示是否在原地进行排序,可以是 True 或 False,默认值是 False,表示返回一个排序后的副本,原数据不变。

  1. import pandas as pd
  2. # 创建一个示例 DataFrame
  3. data = {'A': [2, 1, 3],
  4. 'B': [5, 3, 1]}
  5. df = pd.DataFrame(data, index=[2, 1, 3])
  6. # 按行索引进行升序排序
  7. result = df.sort_index()
  8. print(result)
  9. # 按列索引进行降序排序
  10. result = df.sort_index(axis=1, ascending=False)
  11. print(result)

在示例中,创建了一个 DataFrame,并使用 sort_index() 方法按行索引进行升序排序和按列索引进行降序排序。其打印结果为

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

4.2按照变量值排序

用于按照指定列的值进行排序,语法如下:

  1. df.sort_values(
  2. by :指定用于排序的变量名,多列时以列表形式提供
  3. ascending = True :是否为升序排列
  4. inplace = False :
  5. na_position = 'last‘ :缺失值的排列顺序,
  6. first/last
  7. df.sort_values(by, axis=0, ascending=True, inplace=False)

其中by参数表示排序的依据列,可以是列标签(字符串)或列标签列表(字符串列表)

  1. import pandas as pd
  2. # 创建一个示例 DataFrame
  3. data = {'A': [2, 1, 3],
  4. 'B': [5, 3, 1]}
  5. df = pd.DataFrame(data)
  6. # 按照列 'A' 的值进行升序排序
  7. result = df.sort_values(by='A')
  8. print(result)
  9. # 按照列 'B' 和 'A' 的值进行降序排序
  10. result = df.sort_values(by=['B', 'A'], ascending=[False, False])
  11. print(result)

5、计算新变量

5.1 新变量为常数
df['vamame'] = value#用于向DataFrame中添加新列或修改现有列的操作。
  1. import pandas as pd
  2. # 创建一个示例 DataFrame
  3. data = {'A': [1, 2, 3],
  4. 'B': [4, 5, 6]}
  5. df = pd.DataFrame(data)
  6. # 添加新列 'C',并赋予新的值
  7. df['C'] = [7, 8, 9]
  8. print(df)
  9. # 修改列 'A' 的值
  10. df['A'] = [10, 11, 12]
  11. print(df)
5.2 基于原变量做简单四则运算
  1. df['var'] = df['oldvar'] *100
  2. df['var'] = df.oldvar * 100

        这两个语句都是用来创建一个新的列 'var',并将 'oldvar' 列中的值乘以100赋给 'var' 列。

        第一个语句 df['var'] = df['oldvar'] * 100 使用了方括号将列名 'var' 和 'oldvar' 包裹起来,表示访问和操作 DataFrame 中的列。

        第二个语句 df['var'] = df.oldvar * 100 使用了点运算符,将 DataFrame 中的 'oldvar' 列作为一个属性进行访问。

        两个语句效果相同,都是将 'oldvar' 列中的每个值乘以100,然后赋给 'var' 列。

 df ['new_val'] = df .总分 + df .名次 + 1
  1. # 使用内部函数计算
  2. import math
  3. df['n3'] = math.sqrt(9)
  4. df['n4'] = math.sqrt(df.体重)  #报错
  5. import numpy
  6. df['n4'] = numpy.sqrt(df.体重)
  • df['n3'] = math.sqrt(9),这行代码将 math.sqrt(9) 的结果(即3)赋给了新的列 'n3'。因为求根号9的结果是3。

  • df['n4'] = math.sqrt(df.体重),这行代码试图计算 DataFrame 列 '体重' 中每个值的平方根,并将结果赋给新的列 'n4'。但是这行代码会报错,因为 math.sqrt() 函数不支持作用于整个 DataFrame 列,只能逐个计算单个值的平方根。

  • df['n4'] = numpy.sqrt(df.体重),这行代码使用了 numpy.sqrt() 函数。numpy.sqrt() 函数支持对整个 DataFrame 列进行计算,所以可以成功求出 '体重' 列每个值的平方根,并将结果赋给新的列 'n4'。

5.3 基于一个原变量做函数运算
  1. df.apply(
  2. func : 希望对行/列执行的函数表达式
  3. axis = 0 : 针对行还是列逬行计算
  4. 'index': 针对每列进行计算
  5. 'columns': 针对每行逬行计算
  6. )

简化的用法:

df [' varname ' ] = df. oldvar. apply (函数表达式)
  1. df['n5'] = df.体重.apply(math.sqrt)
  2. df['n7'] = df.体重.apply(numpy.sqrt)
  1. # 使用自定义函数
  2. def get_first(tmp):
  3.    return tmp[:1]
  4. df['n6'] = df.开设.apply(get_first)

5.4 不修改原df,而是生成新的df

用法如下:

df.assign(varname = expression)
  1. # 返回新的dataframe
  2. df2 = df.assign(n8 = df.课程.apply(get_first))
5.5 在指定位置插入新变量列
  1. df.insert(
  2. loc :插入位置的索引值,0 <= loc <= len (columns)
  3. column :插入的新列名称
  4. value : Series 或者类数组结构的变量值
  5. allow_duplicates = False :是否允许新列重名
  6. )#该方法会直接修改原 df
  1. # 指定位置增加新列
  2. df.insert(1,'new_col',100)#插入位置索引值为1,插入名称为new_col,插入变量值为100
  3. df.insert(1,'new_col2',df.课程.apply(get_first))

其中

  • df.insert(1,'new_col',100)这行代码在索引位置1之前插入了一个名为 'new_col' 的新列,并将所有的值初始化为 100。这意味着新列将位于原始 DataFrame 的第二列位置。

  • df.insert(1,'new_col2',df.课程.apply(get_first))这行代码在索引位置1之前插入了一个名为 'new_col2' 的新列,并使用 df.课程.apply(get_first) 来为新列赋值df.课程 是一个 Series 或 DataFrame 列,apply() 函数将 get_first 函数应用于每个元素,并返回一个新的 Series 或 DataFrame 列。因此,新列 'new_col2' 的值将根据 get_first 函数的结果进行赋值。请注意,get_first 是一个自定义的函数,它的具体实现需要根据具体的需求来编写。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/893841
推荐阅读
相关标签
  

闽ICP备14008679号