python数分常用函数

1,195 阅读12分钟

DataFrame中的dt属性

  1. 语法:pd.to_datetime(df['列名'],format="")
  2. dt[''].dt.day_name():星期名称
  3. dt[''].dt.month_name():月份名称
  4. dt[''].dt.date()/dt[''].dt.normalize():返回日期(年月日),前者返回object类型,后者返回datetime64类型
  5. dt[''].dt.time:返回时间(时分秒)
  6. dt[''].dt.year/month/day/hour/minute/second:返回年、月、日、时、分、秒
  7. dt[''].dt.isocalendar():返回三元组(year,week,day)日历,年、一年中的第几周、一周中的第几天(周一第一天)
  8. dt[''].dt.dayofyear:返回一年中的第几天
  9. dt[''].dt.quarter:返回第几季
  10. dt[''].dt.is_month_start/is_month_end/is_year_start/is_year_end/ is_quarter_start/is_quarter_end:返回bool,是否是每月(年、季)的第一天或最后 一天
  11. dt[''].dt.is_leap_year:返回bool,是否是闰年
  12. dt[''].dt.to_period('Q'):以特定频率显示日期(Q以季度频率显示日期)

DataFrame中的str属性

  1. dt[''].str.contains(str):查询某一列包含str字符串的数据
  2. dt[''].str.split(pat=str,expand=True,n=int):将字符串按pat分割,expand=True表示是否将返回值转换成dataframe,n表示分割几次
  3. dt[''].str.sllice(start,end,step):切片子字符串【start,end),步长为step
  4. dt[''].str.cat(list[Any]|Series|DataFrame,step:str):字符串拼接
    df['c1'].str.cat(df['c2'],'&')#c2是字符串
    df['c1'].str.cat(df['c2'].astype(str),'&')#c2不是字符串
    
  5. dt[''].str.replace(pat=str,repl=str):将某列的pat替换成repl
  6. dt[''].str.slice_replace(start,stop,repl):将某列【start,stop)之间的字符串替换成repl
  7. dt[''].str.startswith/endswith(pat=str):判断某列字符串两端的字符判断
  8. dt[''].str.get(n):通过下标获取字符
  9. dt[''].str.pad(width,side,fillchar):字符串左右补充,side=left/right/both,将填充字符fillchar填充到side端,填充到width的宽度
  10. dt[''].str.strip()/lstrip()/rstrip():去除两端空格、左边空格、右边空格

Pandas中的resample方法

Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法。重新取样时间序列数据。

方便的时间序列的频率转换和重采样方法。对象必须具有类似datetime的索引(DatetimeIndex、PeriodIndex或TimedeltaIndex),或将类似datetime的值传递给on或level关键字。

DataFrame.resample(rule, axis=0, closed=None, label=None, convention='start', kind=None, 
loffset=None, base=None, on=None, level=None, origin='start_day', offset=None)

参数详解

参数说明
rule表示目标转换的偏移量字符串或对象
freq表示重采样频率,例如‘M’、‘5min’,Second(15)
how=‘mean’用于产生聚合值的函数名或数组函数,例如‘mean’、‘ohlc’、np.max等,默认是‘mean’,其他常用的值由:‘first’、‘last’、‘median’、‘max’、‘min’
axis=0哪个轴用于向上采样或向下采样。对于序列,这将默认为0,即沿着行。必须是DatetimeIndex, TimedeltaIndex或PeriodIndex。默认是纵轴,横轴设置axis=1
fill_method = None升采样时如何插值,比如‘ffill’、‘bfill’等
closed = ‘right’在降采样时,各时间段的哪一段是闭合的,‘right’或‘left’,默认‘right’
label= ‘right’在降采样时,如何设置聚合值的标签,例如,9:30-9:35会被标记成9:30还是9:35,默认9:35
convention = None当重采样时期时,将低频率转换到高频率所采用的约定(start或end)。默认‘end’
kind = None聚合到时期(‘period’)或时间戳(‘timestamp’),默认聚合到时间序列的索引类型
loffset = None调整重新取样的时间标签
base对于平均细分1天的频率,为累计间隔的“起源”。例如,对于“5min”频率,基数可以从0到4。默认值为0。
on对于数据流,要使用列而不是索引进行重采样。列必须与日期时间类似。
level对于多索引,用于重采样的级别(名称或数字)。级别必须与日期时间相似
origin要调整分组的时间戳。起始时区必须与索引的时区匹配。如果没有使用时间戳,也支持以下值:epoch:原点是1970-01-01’;start ': origin是timeseries的第一个值;“start_day”:起源是timeseries午夜的第一天;
offset加到原点的偏移时间增量
index = pd.date_range('1/1/2000', periods=9, freq='T')
series = pd.Series(range(9), index=index)
series

2000-01-01 00:00:00  0
2000-01-01 00:01:00  1
2000-01-01 00:02:00  2
2000-01-01 00:03:00  3
2000-01-01 00:04:00  4
2000-01-01 00:05:00  5
2000-01-01 00:06:00  6
2000-01-01 00:07:00  7
2000-01-01 00:08:00  8
Freq: T, dtype: int64

将该系列数据采样到3分钟箱中,并对落入箱中的时间戳的值求和。

series.resample('3T').sum()

2000-01-01 00:00:00   3
2000-01-01 00:03:00  12
2000-01-01 00:06:00  21
Freq: 3T, dtype: int64

如上所述,将系列下采样到3分钟的容器中,但请使用右侧边缘而不是左侧标记每个容器。 请注意,用作标签的存储桶中的值不包含在其标记的存储桶中。 例如,在原始系列中,存储区2000-01-01 00:03:00包含值3,但重新采样的存储区中标有2000-01-01 00:03:00的总和值不包含3( 如果是,则总和为6,而不是3)。 要包括此值,请关闭bin间隔的右侧,如下面的示例所示。

series.resample('3T', label='right').sum()

2000-01-01 00:03:00     3
2000-01-01 00:06:00    12
2000-01-01 00:09:00    21
Freq: 3T, dtype: int64

如上所述,将系列降采样到3分钟的箱中,但关闭箱间隔的右侧。

series.resample('3T', label='right', closed='right').sum()

2000-01-01 00:00:00     0
2000-01-01 00:03:00     6
2000-01-01 00:06:00    15
2000-01-01 00:09:00    15
Freq: 3T, dtype: int64
series.resample('30S').asfreq()[0:5]   # Select first 5 rows
asfreq():保持原有频率不变,不改变原有数据,就是不进行聚合运算

2000-01-01 00:00:00   0.0
2000-01-01 00:00:30   NaN
2000-01-01 00:01:00   1.0
2000-01-01 00:01:30   NaN
2000-01-01 00:02:00   2.0
Freq: 30S, dtype: float64

将序列上采样到30秒的箱子中,并使用bfill方法填充NaN值。

series.resample('30S').bfill()[0:5]

2000-01-01 00:00:00    0
2000-01-01 00:00:30    1
2000-01-01 00:01:00    1
2000-01-01 00:01:30    2
2000-01-01 00:02:00    2
Freq: 30S, dtype: int64

pandas合并多个excel(相同字段)

os.walk()以递归的方式遍历一个目录树,获取关于目录结构的信息,包括其子目录和文件。

os.walk(top, topdown=True, onerror=None, followlinks=False) 是 os 模块中的一个函数,用于生成遍历目录树的文件名。这个函数返回一个三元组 (dirpath, dirnames, filenames)

  • dirpath 是一个字符串,表示正在遍历的目录的路径。
  • dirnames 是一个列表,包含了 dirpath 下所有子目录的名字。
  • filenames 是一个列表,包含了非目录文件的名字。

参数详解

  1. top:要遍历的顶级目录的路径。
  2. topdown (可选):如果为 True(默认值),则从顶级开始向下遍历。如果为 False,则从底部的子目录开始向上遍历。
  3. onerror (可选):是一个函数,用于错误处理。如果指定,则应该是一个接受单个参数(异常实例)的函数。如果未指定或为 None,错误将被忽略。
  4. followlinks (可选):如果为 True,则会遍历符号链接指向的目录。

示例

import os

# 指定顶级目录路径
top_path = 'my_project'

# 使用 os.walk() 遍历目录
for dirpath, dirnames, filenames in os.walk(top_path):
    print(f"当前目录: {dirpath}")
    print("子目录:")
    for dirname in dirnames:
        print(f"  {dirname}")
    print("文件:")
    for filename in filenames:
        print(f"  {filename}")
    print("-" * 20)        # 打印分隔线以区分不同的目录

合并多个相同字段的excel

'''导入pandas库和os库'''
import pandas as pd
import os
 
'''定义一个空DataFrame对象,用于添加每个excel中的内容,注意列名一致'''
df_empty=pd.DataFrame(columns=['列1','列2','列3','列4','列5'])
 
'''定义文件夹的路径'''
file_directory =r'excel所在文件夹路径'
#dirpath为当前路径,dirnames为当前路径下的文件夹,filenames为当前路径下所有文件 。
'''利用os库的walk功能遍历文件夹里的所有文件,并读取文件名字'''
for dirpath, dirnames, filenames in os.walk(file_directory):  
    for filename in filenames:
        '''os.path.join能够将文件夹的路径和文件名字合并成每个文件的完整路径'''
        file_path = os.path.join(dirpath, filename)
        rd=pd.read_excel(file_path,"Sheet1",header=0)
        df_empty=pd.concat([df_empty,rd],ignore_index=True)
        
    df_empty.to_excel(r'总体汇总.xlsx保存路径')

删除某个字段包含某些词汇的数据行

| 正则中的或操作符
na=False 参数表示如果某行的`说明字面`字段是空值(NaN),则该行不会被选中。
flags=re.IGNORECASE 参数使得匹配过程不区分大小写。


df.drop(df[df['列名'].str.contains('词汇1|词汇2', na=False,flags=re.IGNORECASE)].index, 
inplace=True)

pandas的nlargest()和nsmallest()的详细用法

Pandas库中的DataFrame方法nlargest(),用于返回DataFrame中指定列中最大值的行,nsmallest()获取指定列的最小的几行 df.nlargest()是一个DataFrame的方法,用于返回DataFrame中最大的n个值所在的行。它的语法如下:

df.nlargest(n, columns, keep='first')

参数说明:

  • n:要返回的最大值的数量。
  • columns:用于排序的列名或列名列表。
  • keep:指定如何处理具有相同值的行。默认值为’first’,表示保留第一个出现的行;如果设置为’last’,则保留最后一个出现的行。

df1.nlargest(3,列名1):按列名1获取最高的3行数据,并按降序排序。

分组后取最大的几行

按分组依据分组后,根据列获取最大的n行df1.groupby(by='分组依据').apply(lambda x:x.nlargest(n,列名))

分组之后再求和df1.groupby(by='分组依据').apply(lambda x:x.nlargest(n,列名)).sum(level='分组依据')

pandas的transform函数

transform可以高效地汇总数据且不改变数据行数,该函数的核心功能是,既计算了统计值,又保留了明细数据,类似于窗口函数。

  1. 作用于单列
    • df1['列名'].transform(np.log)内置函数,对列对数化
    • df1['列名'].transform(lambda s:s+1)使用lambda表达式
    • df1['列名'].transform([np.log, lambda s: s+1, np.sqrt])多个函数计算多列
    • df1['列名'].transform(lambda s: (s - s.mean()) / s.std())做标准化
  2. 作用于整个dataframe,作用于每一列中
    • df1.loc[:,'列名1':'列名2'].transform(lambda s:(s-s.mean()) /s.std())
    • df1.loc[:,'列名1':'列名2'].transform([np.log, lambda s: s+1])传入多个变换函数时,会生成MultiIndex格式的字段名
    • df1.loc[:, '列名1': '列名2'].transform({'列名1': lambda s:(s-s.mean())/s.std(),'列名2': [np.log, np.sqrt]}))
  3. 作用于groupby分组后
    • df1['mean']=df1.groupby('分组依据列')[['列名1','列名2']].transform('mean')分组后,对每组的列求平均值

Python的os方法

os.path 模块是 Python 标准库中 os 模块的一部分,专门用于操作和处理文件路径。

os.path 提供了一组强大的工具来对文件和目录路径进行各种操作,例如获取文件名、判断路径是否存在、路径拼接、路径规范化等。

os.path 模块在跨平台操作系统中表现良好,使得同一段代码能够在不同操作系统(如 Windows、Linux、macOS)上运行时处理路径相关问题。

  • os.chdir(path):要切换到的新路径
  • os.getcwd(path):返回当前工作目录
  • os.makedirs(name):递归创建多级目录
  • os.mkdir(path):创建文件夹
  • os.remove(path):删除路径为path的文件
  • os.removedirs(path):递归删除空目录
  • os.rmdir(path):删除指定空目录

以下是 os.path 模块的几种常用方法:

1. 路径操作

  • os.path.basename(path):路径的最后一部分(最后一个'/'后面的)
  • os.path.dirname(path):路径去掉最后一部分(最后一个'/'前面的)
  • os.path.split(path):将路径根据最后一个'/'分割成两部分的元组
  • os.path.splitext(path):将路径根据扩展名分成两部分的元组

image.png

2. 路径信息获取

image.png

3. 路径规范化

image.png

4. 路径比较

image.png

5. 平台依赖功能

image.png

glob模块

 glob.glob()函数的参数和返回值

  • def glob(pathname, *, recursive=False):

    • pathname:该参数是要匹配的路径
    • recursive:如果是true就会递归的去匹配符合的文件路径,默认是False
  • 返回匹配到的路径列表

  • glob.iglob参数glob.glob()一样

  • def iglob(pathname, *, recursive=False):

    • pathname:该参数是要匹配的路径
    • recursive:如果是true就会递归的去匹配符合的文件路径,默认是False
  • 返回一个迭代器,遍历该迭代器的结果与使用相同参数调用glob()的返回结果一致

glob.glob('./test/*') #匹配./test/下的所有文件和目录,返回路径列表,不递归
glob.glob('./test/**',recursive=True)#递归匹配./test/**下的所有文件和目录,返回路径列表
#如果要对某个目录下递归匹配,要在目录下加两个*

相关性分析

pandas的dataframe.corr()方法用于计算DataFrame中各列之间的相关系数。 DataFrame.corr(method='pearson', min_periods=1)

其中,method参数用于指定计算相关系数的方法,常用的方法包括:

  • pearson:皮尔逊相关系数(默认)
  • kendall:肯德尔相关系数
  • spearman:斯皮尔曼相关系数

min_periods参数用于指定计算相关系数所需的最小非缺失值数量。