Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Lambda函数在.iloc[]中可调用_Python_Pandas - Fatal编程技术网

Python Lambda函数在.iloc[]中可调用

Python Lambda函数在.iloc[]中可调用,python,pandas,Python,Pandas,我希望使用Lambda作为可调用到.iloc[] 输入: df = pd.DataFrame({'A':['sdfg',23,'MrkA',34,0,56],'B':['jfgh',23,45,'Mrk1',0,56],\ 'C':['cvb',7,65,65,47,3],'D':['rrb',7,76,3,0,7],\ 'E':['dfg',7,'MrkA',5,12,1],'F':['dfg',7,2,'Mrk2',

我希望使用
Lambda
作为可调用到
.iloc[]

输入:

df = pd.DataFrame({'A':['sdfg',23,'MrkA',34,0,56],'B':['jfgh',23,45,'Mrk1',0,56],\
                   'C':['cvb',7,65,65,47,3],'D':['rrb',7,76,3,0,7],\
                   'E':['dfg',7,'MrkA',5,12,1],'F':['dfg',7,2,'Mrk2',0,4],'G':['dfg',7,1,5,8,9],\
                   'H':['dfg',7,'MrkA',5,0,8],'I':['dfg',7,56,'Mrk3',7,23]})
    
   
    
l1=[lambda c:c, lambda c:c+1,lambda c:c+2]
l2=[lambda c:c, lambda c:c+1,lambda c:c+2, lambda c:c+4,lambda c:c+5]
l3=[lambda c:c, lambda c:c+1,lambda c:c+2, lambda c:c+4,lambda c:c+5, lambda c:c+7,lambda c:c+8]
    
    
#number of instances of MrkA=1 then pass in l1
if df.count('MrkA')==1:
    l=l1
    print(l1)
#number of instances of MrkA=2 then pass in l2
elif df.count('MrkA')==2:
    l=l2
    print(l2)
#number of instances of MrkA=3 then pass in l3
else: 
    l=l3
    print(l3)

for c in range(df.shape[1]):
    for r in range(df.shape[0]):
        if df.iloc[r, c] == "MrkA" and df.iloc[r + 1, c + 1] == "Mrk1":
            df1=df.iloc[r+1:,[l]]
            break
输出:
df

      A     B    C    D     E     F    G     H     I
0  sdfg  jfgh  cvb  rrb   dfg   dfg  dfg   dfg   dfg
1    23    23    7    7     7     7    7     7     7
2  MrkA    45   65   76  MrkA     2    1  MrkA    56
3    34  Mrk1   65    3     5  Mrk2    5     5  Mrk3
4     0     0   47    0    12     0    8     0     7
5    56    56    3    7     1     4    9     8    23
输出
df1

.iloc requires numeric indexers, got [[<function <lambda> at 0x0000021EBD67AA60>
  <function <lambda> at 0x0000021EBD67A8B0>
  <function <lambda> at 0x0000021EBD67A820>]]
有什么建议吗?我想对Lambda之类的东西应用逻辑,因为我想要的列数将取决于我的real
df
(excel工作表)

中的其他参数两个问题:

  • 您的代码示例包含一个错误df.count('MrkA')。计数需要一个轴
  • 使用lambda c:[c,c+…]指定所需的列
  • 以下代码基于在整个数据帧中查找MrKA计数

    代码

    import pandas as pd
    
    df = pd.DataFrame({'A':['sdfg',23,'MrkA',34,0,56],'B':['jfgh',23,45,'Mrk1',0,56],\
                       'C':['cvb',7,65,65,47,3],'D':['rrb',7,76,3,0,7],\
                       'E':['dfg',7,'MrkA',5,12,1],'F':['dfg',7,2,'Mrk2',0,4],'G':['dfg',7,1,5,8,9],\
                       'H':['dfg',7,'MrkA',5,0,8],'I':['dfg',7,56,'Mrk3',7,23]})
    
    l1=lambda c: [c, c+1, c+2] # [lambda c:c, lambda c:c+1,lambda c:c+2]
    l2=lambda c: [c, c+1, c+2, c+4, c+5] #[lambda c:c, lambda c:c+1,lambda c:c+2, lambda c:c+4,lambda c:c+5]
    l3=lambda c: [c, c+1, c+2,c+4, c+5, c+7, c+8] #[lambda c:c, lambda c:c+1,lambda c:c+2, lambda c:c+4,lambda c:c+5, lambda c:c+7,lambda c:c+8]
        
    #number of instances of MrkA=1 then pass in l1
    if df[df=='MrkA'].size==1:
        l=l1
        print('Count == 1', l1)
    #number of instances of MrkA=2 then pass in l2
    elif df[df=='MrkA'].size==2:
        l=l2
        print('Count = 2', l2)
    #number of instances of MrkA=3 then pass in l3
    else: 
        l=l3
        print('Else Clause', l3)
    
    for c in range(df.shape[1]):
        for r in range(df.shape[0]):
            if df.iloc[r, c] == "MrkA" and df.iloc[r + 1, c + 1] == "Mrk1":
                df1=df.iloc[r+1:, l(c)]
                break
    print()
    print(df)
    print()
    print(df1)
    
    替代解决方案使用原始lambda

    l1 = [lambda c:c, lambda c:c+1,lambda c:c+2]
    l2 = [lambda c:c, lambda c:c+1,lambda c:c+2, lambda c:c+4,lambda c:c+5]
    l3=[lambda c:c, lambda c:c+1,lambda c:c+2, lambda c:c+4,lambda c:c+5, lambda c:c+7,lambda c:c+8]
        
    #number of instances of MrkA=1 then pass in l1
    if df[df=='MrkA'].size==1:
        l=l1
        print('Count == 1', l1)
    #number of instances of MrkA=2 then pass in l2
    elif df[df=='MrkA'].size==2:
        l=l2
        print('Count = 2', l2)
    #number of instances of MrkA=3 then pass in l3
    else: 
        l=l3
        print('Else Clause', l3)
    
    for c in range(df.shape[1]):
        for r in range(df.shape[0]):
            if df.iloc[r, c] == "MrkA" and df.iloc[r + 1, c + 1] == "Mrk1":
                # l is an array of functions
                # use list comprehension to obtain
                # array of values
                df1=df.iloc[r+1:, [f(c) for f in l]]
                break
    
    输出——两种方法

    Else Clause <function <lambda> at 0x7f2fde12f550>
    
          A     B    C    D     E     F    G     H     I
    0  sdfg  jfgh  cvb  rrb   dfg   dfg  dfg   dfg   dfg
    1    23    23    7    7     7     7    7     7     7
    2  MrkA    45   65   76  MrkA     2    1  MrkA    56
    3    34  Mrk1   65    3     5  Mrk2    5     5  Mrk3
    4     0     0   47    0    12     0    8     0     7
    5    56    56    3    7     1     4    9     8    23
    
        A     B   C   E     F  H     I
    3  34  Mrk1  65   5  Mrk2  5  Mrk3
    4   0     0  47  12     0  0     7
    5  56    56   3   1     4  8    23
    
    Else子句
    A B C D E F G H I
    0 sdfg jfgh cvb rrb dfg dfg dfg dfg dfg dfg dfg
    1    23    23    7    7     7     7    7     7     7
    2 MrkA 45 65 76 MrkA 2 1 MrkA 56
    3 34 Mrk1 65 3 5 Mrk2 5 5 Mrk3
    4     0     0   47    0    12     0    8     0     7
    5    56    56    3    7     1     4    9     8    23
    A B C E F H I
    3 34 Mrk1 65 5 Mrk2 5 Mrk3
    4   0     0  47  12     0  0     7
    5  56    56   3   1     4  8    23
    
    两个问题:

  • 您的代码示例包含一个错误df.count('MrkA')。计数需要一个轴
  • 使用lambda c:[c,c+…]指定所需的列
  • 以下代码基于在整个数据帧中查找MrKA计数

    代码

    import pandas as pd
    
    df = pd.DataFrame({'A':['sdfg',23,'MrkA',34,0,56],'B':['jfgh',23,45,'Mrk1',0,56],\
                       'C':['cvb',7,65,65,47,3],'D':['rrb',7,76,3,0,7],\
                       'E':['dfg',7,'MrkA',5,12,1],'F':['dfg',7,2,'Mrk2',0,4],'G':['dfg',7,1,5,8,9],\
                       'H':['dfg',7,'MrkA',5,0,8],'I':['dfg',7,56,'Mrk3',7,23]})
    
    l1=lambda c: [c, c+1, c+2] # [lambda c:c, lambda c:c+1,lambda c:c+2]
    l2=lambda c: [c, c+1, c+2, c+4, c+5] #[lambda c:c, lambda c:c+1,lambda c:c+2, lambda c:c+4,lambda c:c+5]
    l3=lambda c: [c, c+1, c+2,c+4, c+5, c+7, c+8] #[lambda c:c, lambda c:c+1,lambda c:c+2, lambda c:c+4,lambda c:c+5, lambda c:c+7,lambda c:c+8]
        
    #number of instances of MrkA=1 then pass in l1
    if df[df=='MrkA'].size==1:
        l=l1
        print('Count == 1', l1)
    #number of instances of MrkA=2 then pass in l2
    elif df[df=='MrkA'].size==2:
        l=l2
        print('Count = 2', l2)
    #number of instances of MrkA=3 then pass in l3
    else: 
        l=l3
        print('Else Clause', l3)
    
    for c in range(df.shape[1]):
        for r in range(df.shape[0]):
            if df.iloc[r, c] == "MrkA" and df.iloc[r + 1, c + 1] == "Mrk1":
                df1=df.iloc[r+1:, l(c)]
                break
    print()
    print(df)
    print()
    print(df1)
    
    替代解决方案使用原始lambda

    l1 = [lambda c:c, lambda c:c+1,lambda c:c+2]
    l2 = [lambda c:c, lambda c:c+1,lambda c:c+2, lambda c:c+4,lambda c:c+5]
    l3=[lambda c:c, lambda c:c+1,lambda c:c+2, lambda c:c+4,lambda c:c+5, lambda c:c+7,lambda c:c+8]
        
    #number of instances of MrkA=1 then pass in l1
    if df[df=='MrkA'].size==1:
        l=l1
        print('Count == 1', l1)
    #number of instances of MrkA=2 then pass in l2
    elif df[df=='MrkA'].size==2:
        l=l2
        print('Count = 2', l2)
    #number of instances of MrkA=3 then pass in l3
    else: 
        l=l3
        print('Else Clause', l3)
    
    for c in range(df.shape[1]):
        for r in range(df.shape[0]):
            if df.iloc[r, c] == "MrkA" and df.iloc[r + 1, c + 1] == "Mrk1":
                # l is an array of functions
                # use list comprehension to obtain
                # array of values
                df1=df.iloc[r+1:, [f(c) for f in l]]
                break
    
    输出——两种方法

    Else Clause <function <lambda> at 0x7f2fde12f550>
    
          A     B    C    D     E     F    G     H     I
    0  sdfg  jfgh  cvb  rrb   dfg   dfg  dfg   dfg   dfg
    1    23    23    7    7     7     7    7     7     7
    2  MrkA    45   65   76  MrkA     2    1  MrkA    56
    3    34  Mrk1   65    3     5  Mrk2    5     5  Mrk3
    4     0     0   47    0    12     0    8     0     7
    5    56    56    3    7     1     4    9     8    23
    
        A     B   C   E     F  H     I
    3  34  Mrk1  65   5  Mrk2  5  Mrk3
    4   0     0  47  12     0  0     7
    5  56    56   3   1     4  8    23
    
    Else子句
    A B C D E F G H I
    0 sdfg jfgh cvb rrb dfg dfg dfg dfg dfg dfg dfg
    1    23    23    7    7     7     7    7     7     7
    2 MrkA 45 65 76 MrkA 2 1 MrkA 56
    3 34 Mrk1 65 3 5 Mrk2 5 5 Mrk3
    4     0     0   47    0    12     0    8     0     7
    5    56    56    3    7     1     4    9     8    23
    A B C E F H I
    3 34 Mrk1 65 5 Mrk2 5 Mrk3
    4   0     0  47  12     0  0     7
    5  56    56   3   1     4  8    23
    
    我需要应用逻辑,因为“事先不知道”列数,即我的真实
    df
    将从excel工作表中读取。@darryg谢谢!几乎正确。您的
    l3
    版本没有复制所需的列。我已经编辑了我的原始帖子,为3个
    MrkA
    实例显示了所需的df1,我将查看我可以调整吗it@user9106985--3个实例所需的列是什么?你的帖子有
    l3=[lambda c:c,lambda c:c+1,lambda c:c+2,lambda c:c+4,lambda c:c+5,lambda c:c+7,lambda c:c+8]
    。我注意到这不包括c+6,但假设这是一个错误。你想要没有c+6的列吗?@DarryIG。我想要列'AB C E F H I',也就是说,我不想要列
    C+3,C+6
    @user9106985--
    l1=lambda C:[C,C+1,C+2]
    相当于定义一个函数,即
    def l1:return[C,C+1,C+2]
    。在后一种情况下,希望l1(c)有意义。但是,不鼓励以这种方式使用lambda函数,并倾向于后一种函数定义方法。我需要应用逻辑,因为列数“事先不知道”,即我的real
    df
    将从excel工作表中读取。@darryg谢谢!几乎正确。您的
    l3
    版本没有复制所需的列。我已经编辑了我的原始帖子,为3个
    MrkA
    实例显示了所需的df1,我将查看我可以调整吗it@user9106985--3个实例所需的列是什么?你的帖子有
    l3=[lambda c:c,lambda c:c+1,lambda c:c+2,lambda c:c+4,lambda c:c+5,lambda c:c+7,lambda c:c+8]
    。我注意到这不包括c+6,但假设这是一个错误。你想要没有c+6的列吗?@DarryIG。我想要列'AB C E F H I',也就是说,我不想要列
    C+3,C+6
    @user9106985--
    l1=lambda C:[C,C+1,C+2]
    相当于定义一个函数,即
    def l1:return[C,C+1,C+2]
    。在后一种情况下,希望l1(c)有意义。但是,不鼓励以这种方式使用lambda函数,并且更喜欢后一种函数定义方法。@user9106985——在您的示例中,选择列c、c+1、c+2。如果这不是固定的,那么选择哪些列的依据(逻辑)是什么?你是在问如何指定这三列的函数吗?@DarryIG:我编辑了我的原始帖子,以说明我想要的逻辑。这还不完整,因为我还需要弄清楚如何计算
    MrkA
    的实例数。我想你会大致了解我想说什么do@user9106985--1) df.count('MrkA')提供了一个错误?您是否试图查找MrkA在整个数据帧df中出现的次数?2) 在本例中有3次出现,那么为什么期望的结果是第一种情况(即计数=1)而不是第三种情况?您的代码示例包含错误。问题在于df.count('MrkA')。请注意,count函数对指定轴上的非NA单元格进行计数(每列0,每行1)。你想在这里数数什么?“MrkA”在每行/每列/整个数据帧中的实例?@DarrylG是的.count有一个错误,我正在尝试更正该错误。我真正的数据帧来自电子表格,我不知道某个字符串出现的次数。这就是为什么我需要逻辑。我的
    df
    仅用于演示目的。理想的结果只是为了demonstration@user9106985--在示例中,选择列c、c+1、c+2。如果这不是固定的,那么选择哪些列的依据(逻辑)是什么?你是在问如何指定这三列的函数吗?@DarryIG:我编辑了我的原始帖子,以说明我想要的逻辑。它并不像我需要的那样完整