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

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

时间:2024-07-27 12:24:18浏览次数:14  
标签:... 别睡了 df DataFrame 索引 result 排序 data pandas

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

1、DataFrame的索引和切片

1.1 选择列

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

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

1.2 按行列索引选择

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

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

1.3 lociloc获取

看实例:

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

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

                    

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

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

                        

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

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

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

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

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

2、isin()选择

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

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

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

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

df.col.isin([1,3,5])
df[ df.col.isin([1,3,5])]
df[ df.col.isin(['val1','val2'])]
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中的列名,并使用关系运算符和逻辑运算符进行比较和组合。

import pandas as pd

# 创建一个示例DataFrame
data = {'A': [1, 2, 3, 4, 5],
        'B': [6, 7, 8, 9, 10],
        'C': [11, 12, 13, 14, 15]}
df = pd.DataFrame(data)

# 使用query函数进行查询
result = df.query('A > 2')  # 查询A列大于2的行
print(result)

result = df.query('A > 2 and B < 9')  # 查询A列大于2且B列小于9的行
print(result)

4、排序

4.1 按照索引进行排序

具体用法如下:

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

df.sort_index(axis=0, ascending=True, inplace=False)

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

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

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

import pandas as pd

# 创建一个示例 DataFrame
data = {'A': [2, 1, 3],
        'B': [5, 3, 1]}
df = pd.DataFrame(data, index=[2, 1, 3])

# 按行索引进行升序排序
result = df.sort_index()
print(result)

# 按列索引进行降序排序
result = df.sort_index(axis=1, ascending=False)
print(result)

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

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

4.2按照变量值排序

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

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

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

import pandas as pd

# 创建一个示例 DataFrame
data = {'A': [2, 1, 3],
        'B': [5, 3, 1]}
df = pd.DataFrame(data)

# 按照列 'A' 的值进行升序排序
result = df.sort_values(by='A')
print(result)

# 按照列 'B' 和 'A' 的值进行降序排序
result = df.sort_values(by=['B', 'A'], ascending=[False, False])
print(result)

5、计算新变量

5.1 新变量为常数
df['vamame'] = value#用于向DataFrame中添加新列或修改现有列的操作。
import pandas as pd

# 创建一个示例 DataFrame
data = {'A': [1, 2, 3],
        'B': [4, 5, 6]}
df = pd.DataFrame(data)

# 添加新列 'C',并赋予新的值
df['C'] = [7, 8, 9]
print(df)

# 修改列 'A' 的值
df['A'] = [10, 11, 12]
print(df)
5.2 基于原变量做简单四则运算
df['var'] = df['oldvar'] *100
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
# 使用内部函数计算
import math
df['n3'] = math.sqrt(9)
df['n4'] = math.sqrt(df.体重)  #报错
import numpy
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 基于一个原变量做函数运算
df.apply(
func : 希望对行/列执行的函数表达式
axis = 0 : 针对行还是列逬行计算
'index': 针对每列进行计算
'columns': 针对每行逬行计算
)

简化的用法:

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

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

用法如下:

df.assign(varname = expression)
# 返回新的dataframe
df2 = df.assign(n8 = df.课程.apply(get_first))
5.5 在指定位置插入新变量列
df.insert(
    loc :插入位置的索引值,0 <= loc <= len (columns)
    column :插入的新列名称
    value : Series 或者类数组结构的变量值
    allow_duplicates = False :是否允许新列重名
)#该方法会直接修改原 df
# 指定位置增加新列
df.insert(1,'new_col',100)#插入位置索引值为1,插入名称为new_col,插入变量值为100
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 是一个自定义的函数,它的具体实现需要根据具体的需求来编写。

标签:...,别睡了,df,DataFrame,索引,result,排序,data,pandas
From: https://blog.csdn.net/qq_64603703/article/details/140731191

相关文章

  • 在Pandas中 SQL操作:SQLAlchemy和PyMySQL的区别
    SQLAlchemy和PyMySQL的区别1.SQLAlchemy和PyMySQL简介SQLAlchemy是Python编程语言下的一款开源软件。它提供了SQL工具包和对象关系映射器(ORM)来进行数据库操作。SQLAlchemy可以与多种数据库系统进行交互,包括MySQL、PostgreSQL、SQLite等。PyMySQL是Python编程语言下的一个纯Pyt......
  • Python Pandas 使用 .loc 跨列级别多重索引
    我对python和pandas仍然很陌生,想知道是否有更好的方法来解决我遇到的索引问题。因为我看到人们在这个网站上做了非常巧妙的事情,超出了我通常可以从文档中收集到的内容,所以我想我会问——特别是因为我还在学习。我有一个包含多个列的DataFrame级别,级别0是“meta”和“r......
  • Python,pandas从字符串中解析数字和字符串
    在Python中,我想解析一个字符串并将数字部分(可能有也可能没有小数点)作为浮点数返回,并将后缀作为字符串返回。示例为:7.1英寸->7.1,英寸7.1”->7.1,“7英寸->7.0,英寸-10dB->-10.0,dB-10.2dB->-10.2,dB数字部分和后缀之间没有空格。另外,我想将其应......
  • 为什么警告:FutureWarning:设置不兼容的数据类型的项目已被弃用,并且会在 pandas 的未来
    鉴于这种情况,我不明白为什么要提出这个特殊警告。将函数应用于数字系列时,它会引发“FutureWarning:设置不兼容dtype的项目已被弃用,并将在pandas的未来版本中引发错误。值'[011...100]'具有dtype与int32不兼容,请先显式转换为兼容的数据类型。"这是正在应用的......
  • 如何将 Pandas Dataframe 过滤为整数值?
    我有一个包含字符串值的数据框列。我想过滤到具有整数的行。我可以执行以下操作来查找它是否是数字,但这也会返回浮点数。result=pd.to_numeric(df['col1'],errors='coerce').notnull()应该返回“1”不应返回“1.1”。如何过滤为整数(不包括漂浮)?可以使用......
  • 在 Python 类型提示中区分 PySpark 和 Pandas DataFrame (PyCharm)
    在PyCharm中,如果使用apyspark.sql.DataFrame代替pandas.DataFrame,类型提示似乎不会触发警告,反之亦然。例如以下代码根本不会生成任何警告:frompyspark.sqlimportDataFrameasSparkDataFramefrompandasimportDataFrameasPandasDataFramedef......
  • Numpy&Pandas:pandas库的安装,不同对象的建立,文件的导入和了解数据
    目录前言一、Pandas库的安装二、不同对象的建立1.Series对象的创建1.用index方法指定索引2.在创建的时候就指定索引3.使用字典的方式创建4.将一个常量与index一起传入创建5.输出值和索引2.DataFrame对象的创建1.不指定列名则以键当列名行索引为默认值2.columns指......
  • Python——Pandas(第二讲)
    文章目录变量类型的转换Pandas支持的数据类型在不同数据类型间转换建立索引新建数据框时建立索引读入数据时建立索引指定某列为索引列将索引还原变量列引用和修改索引引用索引修改索引修改索引名修改索引值更新索引Series的索引和切片DataFrame的索引和切片选择列按......
  • 无法编译 Arduino ESP32 代码:.../python3: exec 格式错误
    昨天我使用MacOSArduinoIDE或VSCode编译Arduino草图没有任何问题。但今天什么也编译不了。我尝试在ArduinoIDE或带有Arduino扩展的VSCode中编译的任何草图都会出现此错误:fork/exec/Library/Frameworks/Python.framework/Versions/3.11/bin/python3:exec......
  • 使用 reqMktData 请求数据时出现错误的希腊语(delta、vega...)结果
    我正在使用本机库ibapi(InteractiveBrokers)。我有以下代码:fromibapi.clientimportEClientfromibapi.wrapperimportEWrapperfromibapi.contractimportContractimportthreadingimporttimeclassTradingApp(EWrapper,EClient):......