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之类的东西应用逻辑,因为我想要的列数将取决于我的realdf
(excel工作表)中的其他参数两个问题:
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
两个问题:
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函数,并倾向于后一种函数定义方法。我需要应用逻辑,因为列数“事先不知道”,即我的realdf
将从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:我编辑了我的原始帖子,以说明我想要的逻辑。它并不像我需要的那样完整