python常用pandas函数nlargest / nsmallest及其手动实现

简介: python常用pandas函数nlargest / nsmallest及其手动实现

pandas库

是Python中一个非常强大的数据处理库,提供了高效的数据分析方法和数据结构。它特别适用于处理具有关系型数据或带标签数据的情况,同时在时间序列分析方面也有着出色的表现。

pandas库广泛应用于数据挖掘和分析、金融和经济分析、科学和工程计算等领域。使用pandas库可以轻松地对数据进行筛选、排序、过滤、清理和变换等操作,并可以进行统计和汇总等分析,从而提高数据处理的效率和精度。pandas库还提供了许多常用的函数和方法,例如数据筛选和排序、数据合并和连接等。

Series和DataFrame

pandas库中最常用的数据类型是Series和DataFrame。Series是一维数组,拥有数据与索引;而DataFrame则是一个类似于表格的二维数据结构,其中储存了多个Series。例如:

>>> import pandas as pd

>>> df = pd.DataFrame({

'Title': ['流浪地球 2', '奥本海默', '俄罗斯方块', '银河护卫队 3', '我爱你!', '电锯惊魂 10', '灌篮高手', '梦的背后', '漫长的季节', '1923 第一季', '黑暗荣耀 第二季', '重启人生', '画江湖之不良人 6', '地球脉动 第三季'],

'Award': ['评分最高华语电影', '评分最高外语电影', '年度冷门佳片', '评分最高喜剧片', '评分最高爱情片', '评分最高恐怖片', '评分最高动画片', '评分最高纪录片', '评分最高华语剧集', '评分最高英美新剧', '评分最高韩国剧集', '评分最高日本剧集', '评分最高动画剧集', '评分最高纪录剧集'],

'Score': [9.5, 8.8, 8.0, 8.4, 7.9, 7.4, 8.9, 9.0, 9.4, 9.3, 9.0, 9.3, 9.4, 9.8]}

)

>>> df

       Title     Award  Score

0      流浪地球 2  评分最高华语电影    9.5

1        奥本海默  评分最高外语电影    8.8

2       俄罗斯方块    年度冷门佳片    8.0

3     银河护卫队 3   评分最高喜剧片    8.4

4        我爱你!   评分最高爱情片    7.9

5     电锯惊魂 10   评分最高恐怖片    7.4

6        灌篮高手   评分最高动画片    8.9

7        梦的背后   评分最高纪录片    9.0

8       漫长的季节  评分最高华语剧集    9.4

9    1923 第一季  评分最高英美新剧    9.3

10   黑暗荣耀 第二季  评分最高韩国剧集    9.0

11       重启人生  评分最高日本剧集    9.3

12  画江湖之不良人 6  评分最高动画剧集    9.4

13   地球脉动 第三季  评分最高纪录剧集    9.8

nlargest和nsmallest

本篇就简单说说pandas数据筛选和排序中的nlargest / nsmallest两个函数的用法:

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

Series.nlargest(n, keep='first')

DataFrame.nsmallest(n, columns, keep='first')

Series.nsmallest(n, keep='first')

n是一个整数,表示要返回的行数或值数。


columns是一个标签或标签列表,表示要按照哪些列进行排序。只适用于DataFrame,不适用于Series。


keep是一个字符串,表示当有相同值的时候,如何处理。可以取以下三个值之一:


   'first':保留第一个出现的行或值。

   'last':保留最后一个出现的行或值。

     'all':保留所有出现的行或值。


nlargest函数会返回一个新的DataFrame或Series,包含原数据中最大的n个值,按照降序排列。如果指定了多个列,那么会按照列的顺序依次进行排序。如果原数据中的值不是数值类型,那么会抛出TypeError异常。nsmallest函数则按照升序排列,另外如使用参数 keep='all',会导致返回的结果数会超过第一个参数n的值。

用法示例

>>> df.nlargest(3, 'Score', keep='first')

      Title     Award  Score

13  地球脉动 第三季  评分最高纪录剧集    9.8

0     流浪地球 2  评分最高华语电影    9.5

8      漫长的季节  评分最高华语剧集    9.4

>>> df.nlargest(3, 'Score', keep='last')

       Title     Award  Score

13   地球脉动 第三季  评分最高纪录剧集    9.8

0      流浪地球 2  评分最高华语电影    9.5

12  画江湖之不良人 6  评分最高动画剧集    9.4

>>> df.nlargest(3, 'Score')

      Title     Award  Score

13  地球脉动 第三季  评分最高纪录剧集    9.8

0     流浪地球 2  评分最高华语电影    9.5

8      漫长的季节  评分最高华语剧集    9.4

>>> df.nlargest(3, 'Score', keep='all')

       Title     Award  Score

13   地球脉动 第三季  评分最高纪录剧集    9.8

0      流浪地球 2  评分最高华语电影    9.5

8       漫长的季节  评分最高华语剧集    9.4

12  画江湖之不良人 6  评分最高动画剧集    9.4

>>> df.nsmallest(3, 'Score')

    Title    Award  Score

5  电锯惊魂 10  评分最高恐怖片    7.4

4     我爱你!  评分最高爱情片    7.9

2    俄罗斯方块   年度冷门佳片    8.0


代替方法

df.sort_values()加切片也能实现nlargest和nsmallest的基本功能:


>>> df.sort_values('Score')[-3:][::-1]

       Title     Award  Score

13   地球脉动 第三季  评分最高纪录剧集    9.8

0      流浪地球 2  评分最高华语电影    9.5

12  画江湖之不良人 6  评分最高动画剧集    9.4

>>> df.sort_values('Score')[:3]

    Title    Award  Score

5  电锯惊魂 10  评分最高恐怖片    7.4

4     我爱你!  评分最高爱情片    7.9

2    俄罗斯方块   年度冷门佳片    8.0


手动实现

假如我们不使用pandas,只用python基础数据类型dict()来实现这些功能:


>>> dic = {

'Title': ['流浪地球 2', '奥本海默', '俄罗斯方块', '银河护卫队 3', '我爱你!', '电锯惊魂 10', '灌篮高手', '梦的背后', '漫长的季节', '1923 第一季', '黑暗荣耀 第二季', '重启人生', '画江湖之不良人 6', '地球脉动 第三季'],

'Award': ['评分最高华语电影', '评分最高外语电影', '年度冷门佳片', '评分最高喜剧片', '评分最高爱情片', '评分最高恐怖片', '评分最高动画片', '评分最高纪录片', '评分最高华语剧集', '评分最高英美新剧', '评分最高韩国剧集', '评分最高日本剧集', '评分最高动画剧集', '评分最高纪录剧集'],

'Score': [9.5, 8.8, 8.0, 8.4, 7.9, 7.4, 8.9, 9.0, 9.4, 9.3, 9.0, 9.3, 9.4, 9.8]}

>>> dic['Title']

['流浪地球 2', '奥本海默', '俄罗斯方块', '银河护卫队 3', '我爱你!', '电锯惊魂 10', '灌篮高手', '梦的背后', '漫长的季节', '1923 第一季', '黑暗荣耀 第二季', '重启人生', '画江湖之不良人 6', '地球脉动 第三季']

>>> dic['Score']

[9.5, 8.8, 8.0, 8.4, 7.9, 7.4, 8.9, 9.0, 9.4, 9.3, 9.0, 9.3, 9.4, 9.8]


使用内置函数sorted, zip一行代码就能实现:


>>> sorted(zip(dic['Title'],dic['Award'],dic['Score']),key=lambda x:x[-1])[-3:][::-1]

[('地球脉动 第三季', '评分最高纪录剧集', 9.8), ('流浪地球 2', '评分最高华语电影', 9.5), ('画江湖之不良人 6', '评分最高动画剧集', 9.4)]

>>> sorted(zip(dic['Title'],dic['Award'],dic['Score']),key=lambda x:x[-1])[:3]

[('电锯惊魂 10', '评分最高恐怖片', 7.4), ('我爱你!', '评分最高爱情片', 7.9), ('俄罗斯方块', '年度冷门佳片', 8.0)]


如果也想实现参数keep=last和all,那就稍微复杂些,你可以试试如何实现?


模拟代码

 class DataFrame:
    def __init__(self, dic):
        self.dic = dic
    def nlargest(self, n, Column, keep='first'):
        if n<=0:
            return []
        if Column not in self.dic:
            raise KeyError(f'{Column}')
        if not all([isinstance(i,int) or isinstance(i,float) for i in self.dic[Column]]):
            raise TypeError(f"Column '{Column}' has dtype object, cannot use method 'nlargest' with this dtype")
        lst = [self.dic[i] for i in self.dic.keys()]
        idx = list(self.dic.keys()).index(Column)
        tmp = sorted(zip(*lst) ,key=lambda x:x[idx],reverse=True)
        res = tmp[:n]
        num = tmp[n-1][idx]
        if keep=='first':
            pass
        elif keep=='last':
            for t in tmp[n:]:
                if num==t[idx]:
                    res[-1]=t
                else:
                    break
        elif keep=='all':
            for t in tmp[n:]:
                if num==t[idx]:
                    res.append(t)
                else:
                    break
        else:
            raise ValueError('keep must be either "first", "last" or "all"')
        return res
 
dic = {
'Title': ['流浪地球 2', '奥本海默', '俄罗斯方块', '银河护卫队 3', '我爱你!', '电锯惊魂 10', '灌篮高手', '梦的背后', '漫长的季节', '1923 第一季', '黑暗荣耀 第二季', '重启人生', '画江湖之不良人 6', '地球脉动 第三季'],
'Award': ['评分最高华语电影', '评分最高外语电影', '年度冷门佳片', '评分最高喜剧片', '评分最高爱情片', '评分最高恐怖片', '评分最高动画片', '评分最高纪录片', '评分最高华语剧集', '评分最高英美新剧', '评分最高韩国剧集', '评分最高日本剧集', '评分最高动画剧集', '评分最高纪录剧集'],
'Score': [9.5, 8.8, 8.0, 8.4, 7.9, 7.4, 9.0, 9.0, 9.4, 9.3, 9.0, 9.3, 9.4, 9.8],
}
 
df = DataFrame(dic)
kp = 'first', 'last', 'all'
print('3largest:')
for k in kp:
    print(k+':')
    for n in df.nlargest(3, 'Score', keep=k):
        print(n)
print('7largest:')
for k in kp:
    print(k+':')
    for n in df.nlargest(7, 'Score', keep=k):
        print(n)

运行结果:

3largest:

first:

('地球脉动 第三季', '评分最高纪录剧集', 9.8)

('流浪地球 2', '评分最高华语电影', 9.5)

('漫长的季节', '评分最高华语剧集', 9.4)

last:

('地球脉动 第三季', '评分最高纪录剧集', 9.8)

('流浪地球 2', '评分最高华语电影', 9.5)

('画江湖之不良人 6', '评分最高动画剧集', 9.4)

all:

('地球脉动 第三季', '评分最高纪录剧集', 9.8)

('流浪地球 2', '评分最高华语电影', 9.5)

('漫长的季节', '评分最高华语剧集', 9.4)

('画江湖之不良人 6', '评分最高动画剧集', 9.4)

7largest:

first:

('地球脉动 第三季', '评分最高纪录剧集', 9.8)

('流浪地球 2', '评分最高华语电影', 9.5)

('漫长的季节', '评分最高华语剧集', 9.4)

('画江湖之不良人 6', '评分最高动画剧集', 9.4)

('1923 第一季', '评分最高英美新剧', 9.3)

('重启人生', '评分最高日本剧集', 9.3)

('灌篮高手', '评分最高动画片', 9.0)

last:

('地球脉动 第三季', '评分最高纪录剧集', 9.8)

('流浪地球 2', '评分最高华语电影', 9.5)

('漫长的季节', '评分最高华语剧集', 9.4)

('画江湖之不良人 6', '评分最高动画剧集', 9.4)

('1923 第一季', '评分最高英美新剧', 9.3)

('重启人生', '评分最高日本剧集', 9.3)

('黑暗荣耀 第二季', '评分最高韩国剧集', 9.0)

all:

('地球脉动 第三季', '评分最高纪录剧集', 9.8)

('流浪地球 2', '评分最高华语电影', 9.5)

('漫长的季节', '评分最高华语剧集', 9.4)

('画江湖之不良人 6', '评分最高动画剧集', 9.4)

('1923 第一季', '评分最高英美新剧', 9.3)

('重启人生', '评分最高日本剧集', 9.3)

('灌篮高手', '评分最高动画片', 9.0)

('梦的背后', '评分最高纪录片', 9.0)

('黑暗荣耀 第二季', '评分最高韩国剧集', 9.0)


加强升级

nlargest和nsmallest只差一个排序参数, 修改一下就得到通用方法__sort__(),使用reverse参数来调用nlargest和nsmallest;另外DataFrame类新增__repr__()方法,便于打印时调用。

class DataFrame:
    def __init__(self, dic):
        self.__dic = dic
        self.__lst = [self.__dic[_] for _ in self.__dic.keys()]
        if any([len(self)-len(_) for _ in self.__lst]):
            raise ValueError("All arrays must be of the same length")
    def __repr__(self):
        res = []
        for z in zip(*self.__lst):
            res.append(', '.join(map(lambda x:x.join(["'"]*2) if isinstance(x,str) else str(x) ,z)))
        return '\n'.join(res)
    def __len__(self):
        return len(self.__lst[0])
    def __sort__(self, n, column, keep, reverse=True):
        if n<=0:
            return []
        if n>len(self):
            n = len(self)
        if column not in self.__dic:
            raise KeyError(f'{column}')
        function = __import__('sys')._getframe(1).f_code.co_name
        column_type = f"Column '{column}' has dtype object, cannot use method '{function}' with this dtype"
        if not all([isinstance(_,int) or isinstance(_,float) for _ in self.__dic[column]]):
            raise TypeError(column_type)
        idx = list(self.__dic.keys()).index(column)
        tmp = sorted(zip(*self.__lst), key=lambda x:x[idx], reverse=reverse)
        lst = tmp[:n]
        num = lst[-1][idx]
        match keep:
            case 'first':
                pass
            case 'last':
                for t in tmp[n:]:
                    if num==t[idx]:
                        lst[-1]=t
                    else:
                        break
            case 'all':
                for t in tmp[n:]:
                    if num==t[idx]:
                        lst.append(t)
                    else:
                        break
            case _:
                raise ValueError('keep must be either "first", "last" or "all"')
        res = dict()
        for row in lst:
            for col,key in enumerate(self.__dic.keys()):
                tmp = res.get(key,[])
                tmp.append(row[col])
                res[key] = tmp
        return DataFrame(res)
    def nlargest(self, n, column, keep='first'):
        return self.__sort__(n, column, keep)
    def nsmallest(self, n, column, keep='first'):
        return self.__sort__(n, column, keep, reverse=False)
 
dic = {
'Title': ['流浪地球 2', '奥本海默', '俄罗斯方块', '银河护卫队 3', '我爱你!', '电锯惊魂 10', '灌篮高手', '梦的背后', '漫长的季节', '1923 第一季', '黑暗荣耀 第二季', '重启人生', '画江湖之不良人 6', '地球脉动 第三季'],
'Award': ['评分最高华语电影', '评分最高外语电影', '年度冷门佳片', '评分最高喜剧片', '评分最高爱情片', '评分最高恐怖片', '评分最高动画片', '评分最高纪录片', '评分最高华语剧集', '评分最高英美新剧', '评分最高韩国剧集', '评分最高日本剧集', '评分最高动画剧集', '评分最高纪录剧集'],
'Score': [9.5, 8.8, 8.2, 8.2, 8.2, 7.8, 9.0, 9.0, 9.4, 9.3, 9.0, 9.3, 9.4, 9.8],
}
 
df = DataFrame(dic)
print('DataFrame:')
print(df)
 
kp = 'first', 'last', 'all'
for m in (3,7):
    print(f"df.nlargest({m},'Score'):")
    for k in kp:
        print(f'keep={k}:')
        print(df.nlargest(m, 'Score', keep=k))
print("df.nsmallest(2,'Score')")
for k in kp:
    print(f'keep={k}:')
    print(df.nsmallest(2, 'Score', keep=k))
 
# 改变字典的键值顺序
dic = {
'Score': [9.5, 8.8, 8.2, 8.2, 8.2, 7.8, 9.0, 9.0, 9.4, 9.3, 9.0, 9.3, 9.4, 9.8],
'Title': ['流浪地球 2', '奥本海默', '俄罗斯方块', '银河护卫队 3', '我爱你!', '电锯惊魂 10', '灌篮高手', '梦的背后', '漫长的季节', '1923 第一季', '黑暗荣耀 第二季', '重启人生', '画江湖之不良人 6', '地球脉动 第三季'],
'Award': ['评分最高华语电影', '评分最高外语电影', '年度冷门佳片', '评分最高喜剧片', '评分最高爱情片', '评分最高恐怖片', '评分最高动画片', '评分最高纪录片', '评分最高华语剧集', '评分最高英美新剧', '评分最高韩国剧集', '评分最高日本剧集', '评分最高动画剧集', '评分最高纪录剧集'],
}
df = DataFrame(dic)
print(df)
 
for m in (3,7):
    print(f"df.nlargest({m},'Score'):")
    for k in kp:
        print(f'keep={k}:')
        print(df.nlargest(m, 'Score', keep=k))
print("df.nsmallest(2,'Score')")
for k in kp:
    print(f'keep={k}:')
    print(df.nsmallest(2, 'Score', keep=k))

注:如果Python版本低于 3.10 ,上述代码中match-case需要改回if-elif-else结构。


运行结果:


DataFrame:

'流浪地球 2', '评分最高华语电影', 9.5

'奥本海默', '评分最高外语电影', 8.8

'俄罗斯方块', '年度冷门佳片', 8.2

'银河护卫队 3', '评分最高喜剧片', 8.2

'我爱你!', '评分最高爱情片', 8.2

'电锯惊魂 10', '评分最高恐怖片', 7.8

'灌篮高手', '评分最高动画片', 9.0

'梦的背后', '评分最高纪录片', 9.0

'漫长的季节', '评分最高华语剧集', 9.4

'1923 第一季', '评分最高英美新剧', 9.3

'黑暗荣耀 第二季', '评分最高韩国剧集', 9.0

'重启人生', '评分最高日本剧集', 9.3

'画江湖之不良人 6', '评分最高动画剧集', 9.4

'地球脉动 第三季', '评分最高纪录剧集', 9.8

df.nlargest(3,'Score'):

keep=first:

'地球脉动 第三季', '评分最高纪录剧集', 9.8

'流浪地球 2', '评分最高华语电影', 9.5

'漫长的季节', '评分最高华语剧集', 9.4

keep=last:

'地球脉动 第三季', '评分最高纪录剧集', 9.8

'流浪地球 2', '评分最高华语电影', 9.5

'画江湖之不良人 6', '评分最高动画剧集', 9.4

keep=all:

'地球脉动 第三季', '评分最高纪录剧集', 9.8

'流浪地球 2', '评分最高华语电影', 9.5

'漫长的季节', '评分最高华语剧集', 9.4

'画江湖之不良人 6', '评分最高动画剧集', 9.4

df.nlargest(7,'Score'):

keep=first:

'地球脉动 第三季', '评分最高纪录剧集', 9.8

'流浪地球 2', '评分最高华语电影', 9.5

'漫长的季节', '评分最高华语剧集', 9.4

'画江湖之不良人 6', '评分最高动画剧集', 9.4

'1923 第一季', '评分最高英美新剧', 9.3

'重启人生', '评分最高日本剧集', 9.3

'灌篮高手', '评分最高动画片', 9.0

keep=last:

'地球脉动 第三季', '评分最高纪录剧集', 9.8

'流浪地球 2', '评分最高华语电影', 9.5

'漫长的季节', '评分最高华语剧集', 9.4

'画江湖之不良人 6', '评分最高动画剧集', 9.4

'1923 第一季', '评分最高英美新剧', 9.3

'重启人生', '评分最高日本剧集', 9.3

'黑暗荣耀 第二季', '评分最高韩国剧集', 9.0

keep=all:

'地球脉动 第三季', '评分最高纪录剧集', 9.8

'流浪地球 2', '评分最高华语电影', 9.5

'漫长的季节', '评分最高华语剧集', 9.4

'画江湖之不良人 6', '评分最高动画剧集', 9.4

'1923 第一季', '评分最高英美新剧', 9.3

'重启人生', '评分最高日本剧集', 9.3

'灌篮高手', '评分最高动画片', 9.0

'梦的背后', '评分最高纪录片', 9.0

'黑暗荣耀 第二季', '评分最高韩国剧集', 9.0

df.nsmallest(2,'Score')

keep=first:

'电锯惊魂 10', '评分最高恐怖片', 7.8

'俄罗斯方块', '年度冷门佳片', 8.2

keep=last:

'电锯惊魂 10', '评分最高恐怖片', 7.8

'我爱你!', '评分最高爱情片', 8.2

keep=all:

'电锯惊魂 10', '评分最高恐怖片', 7.8

'俄罗斯方块', '年度冷门佳片', 8.2

'银河护卫队 3', '评分最高喜剧片', 8.2

'我爱你!', '评分最高爱情片', 8.2

9.5, '流浪地球 2', '评分最高华语电影'

8.8, '奥本海默', '评分最高外语电影'

8.2, '俄罗斯方块', '年度冷门佳片'

8.2, '银河护卫队 3', '评分最高喜剧片'

8.2, '我爱你!', '评分最高爱情片'

7.8, '电锯惊魂 10', '评分最高恐怖片'

9.0, '灌篮高手', '评分最高动画片'

9.0, '梦的背后', '评分最高纪录片'

9.4, '漫长的季节', '评分最高华语剧集'

9.3, '1923 第一季', '评分最高英美新剧'

9.0, '黑暗荣耀 第二季', '评分最高韩国剧集'

9.3, '重启人生', '评分最高日本剧集'

9.4, '画江湖之不良人 6', '评分最高动画剧集'

9.8, '地球脉动 第三季', '评分最高纪录剧集'

df.nlargest(3,'Score'):

keep=first:

9.8, '地球脉动 第三季', '评分最高纪录剧集'

9.5, '流浪地球 2', '评分最高华语电影'

9.4, '漫长的季节', '评分最高华语剧集'

keep=last:

9.8, '地球脉动 第三季', '评分最高纪录剧集'

9.5, '流浪地球 2', '评分最高华语电影'

9.4, '画江湖之不良人 6', '评分最高动画剧集'

keep=all:

9.8, '地球脉动 第三季', '评分最高纪录剧集'

9.5, '流浪地球 2', '评分最高华语电影'

9.4, '漫长的季节', '评分最高华语剧集'

9.4, '画江湖之不良人 6', '评分最高动画剧集'

df.nlargest(7,'Score'):

keep=first:

9.8, '地球脉动 第三季', '评分最高纪录剧集'

9.5, '流浪地球 2', '评分最高华语电影'

9.4, '漫长的季节', '评分最高华语剧集'

9.4, '画江湖之不良人 6', '评分最高动画剧集'

9.3, '1923 第一季', '评分最高英美新剧'

9.3, '重启人生', '评分最高日本剧集'

9.0, '灌篮高手', '评分最高动画片'

keep=last:

9.8, '地球脉动 第三季', '评分最高纪录剧集'

9.5, '流浪地球 2', '评分最高华语电影'

9.4, '漫长的季节', '评分最高华语剧集'

9.4, '画江湖之不良人 6', '评分最高动画剧集'

9.3, '1923 第一季', '评分最高英美新剧'

9.3, '重启人生', '评分最高日本剧集'

9.0, '黑暗荣耀 第二季', '评分最高韩国剧集'

keep=all:

9.8, '地球脉动 第三季', '评分最高纪录剧集'

9.5, '流浪地球 2', '评分最高华语电影'

9.4, '漫长的季节', '评分最高华语剧集'

9.4, '画江湖之不良人 6', '评分最高动画剧集'

9.3, '1923 第一季', '评分最高英美新剧'

9.3, '重启人生', '评分最高日本剧集'

9.0, '灌篮高手', '评分最高动画片'

9.0, '梦的背后', '评分最高纪录片'

9.0, '黑暗荣耀 第二季', '评分最高韩国剧集'

df.nsmallest(2,'Score')

keep=first:

7.8, '电锯惊魂 10', '评分最高恐怖片'

8.2, '俄罗斯方块', '年度冷门佳片'

keep=last:

7.8, '电锯惊魂 10', '评分最高恐怖片'

8.2, '我爱你!', '评分最高爱情片'

keep=all:

7.8, '电锯惊魂 10', '评分最高恐怖片'

8.2, '俄罗斯方块', '年度冷门佳片'

8.2, '银河护卫队 3', '评分最高喜剧片'

8.2, '我爱你!', '评分最高爱情片'


【小技巧】


在被调用函数中可用以下代码获取调用函数名:


sys._getframe(1).f_code.co_name


示例:

import sys
 
def my_function():
    frame = sys._getframe(1)
    function = frame.f_code.co_name
    print(f"Called from {function}")
  
def function1():
    my_function()
 
def function2():
    my_function()
 
function1()
function2()

Out:

Called from function1

Called from function2



目录
相关文章
|
24天前
|
开发者 Python
Python入门:8.Python中的函数
### 引言 在编写程序时,函数是一种强大的工具。它们可以将代码逻辑模块化,减少重复代码的编写,并提高程序的可读性和可维护性。无论是初学者还是资深开发者,深入理解函数的使用和设计都是编写高质量代码的基础。本文将从基础概念开始,逐步讲解 Python 中的函数及其高级特性。
Python入门:8.Python中的函数
|
16天前
|
C语言 Python
Python学习:内建属性、内建函数的教程
本文介绍了Python中的内建属性和内建函数。内建属性包括`__init__`、`__new__`、`__class__`等,通过`dir()`函数可以查看类的所有内建属性。内建函数如`range`、`map`、`filter`、`reduce`和`sorted`等,分别用于生成序列、映射操作、过滤操作、累积计算和排序。其中,`reduce`在Python 3中需从`functools`模块导入。示例代码展示了这些特性和函数的具体用法及注意事项。
|
16天前
|
Go Python
Python中的round函数详解及使用示例
`round()`函数是Python内置的用于四舍五入数字的工具。它接受一个数字(必需)和可选的小数位数参数,返回最接近的整数或指定精度的浮点数。本文详细介绍其用法、参数及示例,涵盖基本操作、负数处理、特殊情况及应用建议,帮助你更好地理解和运用该函数。
|
24天前
|
Python
python pandas学习(一)
该代码段展示了四个主要操作:1) 删除指定列名,如商品id;2) 使用正则表达式模糊匹配并删除列,例如匹配订单商品名称1的列;3) 将毫秒级时间戳转换为带有时区调整的日期时间格式,并增加8小时以适应本地时区;4) 将列表转换为DataFrame后保存为Excel文件,文件路径和名称根据变量拼接而成。
25 3
|
17天前
|
人工智能 数据库连接 开发工具
[oeasy]python069_当前作用域都有些什么_列表dir_函数_builtins
本文介绍了Python中`dir()`函数的使用方法及其作用。`dir()`可以列出当前作用域内的所有变量和成员,类似于`locals()`,但`dir()`不仅限于本地变量,还能显示模块中的所有成员。通过`dir(__builtins__)`可以查看内建模块中的所有内建函数,如`print`、`ord`、`chr`等。此外,还回顾了`try-except-finally`结构在数据库连接中的应用,并解释了为何`print`函数可以直接使用而无需导入,因为它位于`__builtins__`模块中。最后,简要提及了删除`__builtins__.print`的方法及其影响。
32 0
|
4月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
163 67
|
2月前
|
存储 数据挖掘 数据处理
Python Pandas入门:行与列快速上手与优化技巧
Pandas是Python中强大的数据分析库,广泛应用于数据科学和数据分析领域。本文为初学者介绍Pandas的基本操作,包括安装、创建DataFrame、行与列的操作及优化技巧。通过实例讲解如何选择、添加、删除行与列,并提供链式操作、向量化处理、索引优化等高效使用Pandas的建议,帮助用户在实际工作中更便捷地处理数据。
57 2
|
2月前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
40 3
|
2月前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
64 2
|
2月前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
32 0