文章目录
- 列操作
- 修改变量列
- 筛选变量列
- 使用.loc[](基于标签)
- 使用.iloc[](基于整数位置)
- 使用.filter()方法
- 删除变量列
- 添加变量列
- 变量类型的转换
- Pandas 支持的数据类型
- 在不同数据类型间转换
- 建立索引
- 新建数据框时建立索引
- 读入数据时建立索引
- 指定某列为索引列
- 将索引还原变量列
- 引用和修改索引
- 引用索引
- 修改索引
- 修改索引值
- 更新索引
- isin()选择
- query()的使用
- 排序
- 用索引排序
- 使用变量值排序
- 通过索引进行排序
- 修改替换变量值
- 对应数值的替换
- 指定数值范围的替换
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