python—pandas基础(2)


Pandas 是 Python 中一个非常强大的数据处理库,它提供了高性能、易用的数据结构和数据分析工具。下面我将继续详细解释 Pandas 的基本概念和常用功能。

列操作

在这里插入图片描述

修改变量列

在Pandas中,如果你想要修改DataFrame或Series中的变量名(即列名),你可以使用.rename()方法。这个方法提供了灵活的方式来重命名列名或索引名。

df = df.rename(columns={'old_name1': 'new_name1', 'old_name2': 'new_name2'},inplace = True)

筛选变量列

你可以直接通过列名来访问或选择DataFrame中的列。如果你想要选择多个列,可以将它们放在列表中。

# 假设df是你的DataFrame  
  
# 选择单个列  
column_data = df['column_name']  # 这将返回一个Series  
  
# 选择多个列  
columns_data = df[['column1', 'column2']]  # 这将返回一个DataFrame

使用.loc[](基于标签)

.loc[]方法允许你通过标签来选择行和列。当用于列选择时,你可以只传递列名的列表(或单个列名)作为第二个参数(如果你同时选择行,则第一个参数是行索引)。

# 选择多个列  
columns_data = df.loc[:, ['column1', 'column2']]  # 冒号`:`表示选择所有行

使用.iloc[](基于整数位置)

虽然.iloc[]主要用于基于整数位置选择行和列,但如果你知道列的确切位置,你也可以使用它来选择列。然而,这种方法不如直接使用列名那么直观或灵活。

# 假设你知道'column1'是第一列,'column2'是第二列  
columns_data = df.iloc[:, [0, 1]]  # 选择前两列

使用.filter()方法
# 选择所有以'col'开头的列  
filtered_data = df.filter(regex='^col')  
  
# 或者,使用lambda函数(尽管对于列选择来说,这通常不如regex直接)  
# filtered_data = df.filter(lambda x: 'some_condition' in x, axis=1)  
# 注意:这里的lambda示例可能需要调整以适应具体的筛选条件

删除变量列

df.drop(columns =['col1','col2']del df['column-name'] #直接删除原数据框相应的一列,建议尽量少用
del df.column_name #不允许

添加变量列

#根据新数据添加
df[cloumn] = pd.Series([val,val2,val3],index=[c1,c2,c3])
#根据原数据添加
df[cloumn] = df[c2]+df[c3]

变量类型的转换

在这里插入图片描述

Pandas 支持的数据类型

具体类型是 Python, Numpy 各种类型的混合,可以比下表分的更细

  • float:Pandas中浮点数的默认类型是float64,用于存储小数。
  • int:Pandas中整数的默认类型是int64,可以存储较大的整数。在32位系统上,NumPy可能会使用int32,但Pandas在创建DataFrame时通常使用int64。
  • bool:布尔类型用于表示真(True)和假(False)的逻辑值。
  • datetime64[nsr] :用于表示日期和时间,精度为纳秒(ns)。这是Pandas中处理日期和时间的主要类型。
  • timedelta[ns]:表示两个时间点之间的时间差,精度同样为纳秒(ns)。
  • category:分类类型是一种特殊的数据类型,用于表示具有有限数量唯一值的列。它可以大大减少内存使用,并提高性能。分类类型非常适合于表示如性别、地区等分类变量。
  • object:在Pandas中,字符串实际上是以object类型存储的。虽然object类型可以存储任何Python对象,但通常用于存储字符串数据。
    df.dtypes :査看各列的数据类型
df.dtypes

在不同数据类型间转换

在Pandas中,你可以使用astype()方法或Pandas提供的特定函数(如pd.to_numeric(), pd.to_datetime()等)来转换数据类型。以下是一些常见的数据类型转换方法:

import pandas as pd  
  
# 创建一个示例DataFrame  
df = pd.DataFrame({  
    'A': ['1', '2', '3', '4'],  # 字符串形式的数字  
    'B': ['a', 'b', 'c', 'd'],  # 字符串  
    'C': [1, 2, 3, 4]  # 整数  
})   
# 使用astype()转换数据类型  
df['A'] = df['A'].astype(int)  # 将列A的字符串转换为整数  
df['B'] = df['B'].astype(str)  # 注意:这实际上没有改变,因为B已经是str类型  
df['C'] = df['C'].astype(float)  # 将列C的整数转换为浮点数  
  
# 尝试将包含非数字的字符串列转换为整数(可能会引发错误或返回NaN)  
# df['B'] = df['B'].astype(int)  # 这会失败,因为'a', 'b', 'c', 'd'不能转换为整数  
  
# 安全地转换,使用errors参数处理无法转换的情况  
df['B_int'] = df['B'].astype(int, errors='coerce')  # 无法转换的将被设置为NaN

建立索引

在这里插入图片描述

新建数据框时建立索引

所有的数据框默认都已经使用从 0 开始的自然数索引,因此这里的"建立”索引指的是自定义索引。

df = pd.DataFrame( {'varl' : 1.0, ' var2' :[1,2,3,4], 'var3' : ['test', 'python','test','hello'], 'var4' : 'cons'} , index =[0,1,2,3])

读入数据时建立索引

使用现有的列

df = pd.read_csv ("filename",index_col="column”)

使用复合列

df = pd.read_csv ("filename", index_col=[0,1..])

指定某列为索引列

在Pandas中,你可以通过set_index()方法将DataFrame中的某一列指定为索引列。这会将该列的值用作行索引,并将该列从DataFrame中移除。

import pandas as pd  
  
# 创建一个示例DataFrame  
data = {'A': ['foo', 'bar', 'baz', 'qux'],  
        'B': [1, 2, 3, 4],  
        'C': [5, 6, 7, 8]}  
df = pd.DataFrame(data)  
  
# 打印原始DataFrame  
print("原始DataFrame:")  
print(df)  
  
# 将列'A'设置为索引  
df_indexed = df.set_index('A')  
  
# 打印设置索引后的DataFrame  
print("\n设置索引后的DataFrame:")  
print(df_indexed)

将索引还原变量列

在Pandas中,如果你之前使用set_index()方法将某列设置为DataFrame的索引,并且之后想要将这个索引还原为一个普通的列,你可以使用reset_index()方法。这个方法会将当前的索引重置为默认的整数索引,并将原来的索引列(或列的多级索引)作为一个或多个新列添加到DataFrame中。

import pandas as pd  
  
# 创建一个示例DataFrame  
data = {'A': ['foo', 'bar', 'baz', 'qux'],  
        'B': [1, 2, 3, 4],  
        'C': [5, 6, 7, 8]}  
df = pd.DataFrame(data)  
  
# 将列'A'设置为索引  
df_indexed = df.set_index('A')  
  
# 打印设置索引后的DataFrame  
print("设置索引后的DataFrame:")  
print(df_indexed)  
  
# 将索引还原为变量列  
df_reset = df_indexed.reset_index()  
  
# 打印索引还原后的DataFrame  
print("\n索引还原后的DataFrame:")  
print(df_reset)

引用和修改索引

在这里插入图片描述

引用索引

注意:索引仍然是有存储格式的,注意区分数值型和字符型的引用方式

df.index

修改索引

#本质上和变量列名的修改方式相同
df = pd.DataFrame({'name':['zs','ls','ww'],'level':['vip1','vip2','pm']})
df.index.name='sno'
df2 = pd.read_excel('stu_data.xlsx')
df3 = df2.set_index(keys = '学号')
df4 = pd.read_excel('stu_data.xlsx')
df5 = df2.set_index(keys = ['学号','性别'])
# df5.index.names = ['no','sex']
df5.index.names=[None,None]
df5

修改索引值

#这里的修改本质上是全部替换
df1.index = ['a', 'b', 'c']

更新索引

在这里插入图片描述reindex 则可以使用数据框中不存在的数值建立索引,并据此扩充新索引值对应的索引行/列,同时进行缺失值填充操作。
df.reindex
(labels :类数组结构的数值,将按此数值重建索引,非必需
copy = True :建立新对象而不是直接更改原 df/series 缺失数据的处理方式
method :针对已经排序过的索引,确定数据单元格无数据时的填充方法,非必需
pad / ffill:用前面的有效数值填充
backfill / bfill:用后面的有效数值填充
nearest:使用最接近的数值逬行填充
fill_value = np.NaN :将缺失值用什么数值替代
limit = None :向前/向后填充时的最大步长)

import pandas as pd
df = pd.DataFrame({'name':['zs','ls','ww'],'level':['vip1','vip2','pm']})
df.reindex([0,1,3])
df.reindex([0,1,2,3],method='ffill')
df.reindex([0,1,2,3],fill_value="test")

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'])]

query()的使用

在这里插入图片描述
使用boolean值表达式进行筛选
df.query(
expr:语句表达式
inplace=False;是否直接替换原数据框
)
可以使用前缀“@”引用环境变量等号为==,而不是=

df.query("col>10 and col<90 and col1=val")
limit = 5
df.query("col<=@limit & col==val")
df.query("col<=@limit & col!=val")

排序

在这里插入图片描述

用索引排序

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

df = pd.read_excel("stu_data.xlsx",index_col=["学号”,”性别”]) df.set_index( ['学号','性别'],inplace = True )
# 通过索引进行排序                                             
df.sort_index()                              
df.sort_index(ascending=False)
df.sort_index(ascending = [True,False])
#设置哪个索引进行排序                          
df.sort_index(level="支出")
df.sort_index(level= ["支出","体重"])

使用变量值排序

df.sort_values(
by :指定用于排序的变量名,多列时以列表形式提供
ascending = True :是否为升序排列
inplace = False :
df = pd.read_excel(“stu_data.xlsx”,
index_col=["学号”,”性别”]) df.set_index( [‘学
号’,‘性别’], inplace = True )

通过索引进行排序

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

# 根据值进行排序
df.sort_values(by='身高')

修改替换变量值

在这里插入图片描述
本质上是如何直接指定单元格的问题,只要能准确定位单元地址,就能够做到准确替换。

# 判断哪一行是我们要的数据
df.体重[1] = 78
df['体重'][1] = 68
df.loc[1,'体重'] = 78
df.开设.isin(['不清楚'])
df.开设[df.开设.isin(['不清楚'])] = '可以'

对应数值的替换

df.replace(
to_replace = None :将被替换的原数值,所有严格匹配的数值将被用 value 替换,可以
str/regex/list/dict/Series/numeric/None
value = None :希望填充的新数值
inplace = False
)

df.开设.replace('可以','不清楚',inplace = True)
df.性别.replace(['女','男'],[0,1],inplace =True)
df.性别.replace({0:'女',1:'男'},inplace =True)

指定数值范围的替换

方法一:使用正则表达式完成替换

df.replace(regex, newvalue)

方法二:使用行筛选方式完成替换,用行筛选方式得到行索引,然后用 loc 命令定位替换,目前也支持直接筛选出单元格进行数值替换。

# 使用正则匹配数据
df.开设.replace(regex = '不.+',value = '可以',inplace = True)
#iloc  loc
df.支出.iloc[0:3] = 20
df.支出.loc[0:2] =30
#条件筛选替换
df.体重[df.体重>70] =70
df[df.体重==70].体重 = 80   # 注意引用问题
#query()的使用
df.query('性别 == "女" and 体重 > 60 ').体重 =50
df.loc[df.query('性别 == "女" and 体重 > 60').体重.index,'体重'] = 50
  • 30
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值