【发布时间】:2020-03-08 07:47:22
【问题描述】:
我正在学习 Python,并且正在研究这样一个数据集:
**Col1** **Col2** **Col3** **Col4**
dog Z st02 0
dog,cat Z st02 1
dog,bat,cat Z st02 2
bat,cat,elephant Y st02 2
dog,bat,cat,elephant Y st02 3
tiger Z st01 0
lion,leopard,cheetah Z st01 2
tiger,lion,leopard,cheetah Z st01 3
dog,tiger,cheetah Y st01 2
dog,tiger,leopard,cheetah Y st01 3
eagle,jaguar,Kangaroo,zebra Z st02 3
cheetah,eagle,jaguar,Kangaroo,zebra Z st02 4
预期的输出是:
**Col1** **Col2** **Col3** **Col4**
dog,bat,cat Z st02 2
dog,bat,cat,elephant Y st02 3
tiger,lion,leopard,cheetah Z st01 3
dog,tiger,leopard,cheetah Y st01 3
cheetah,eagle,jaguar,Kangaroo,zebra Z st02 4
为了提取上述行作为输出,我尝试跟踪模式并使用以下逻辑:
data = pd.read_excel("data.xlsx")
data['Col4'] = data['Col1'].str.count(',')
v1 = []
v2 = []
v1.append(0)
v2.append(0)
for i in range(0,data.shape[0]-1):
x = data['Col_2'][i]
y = data['Col_2'][i+1]
t1 = data['Col_3'][i]
t2 = data['Col_3'][i+1]
g1 = (x == y) & (t1==t2)
d1 = data['Col_1'][i]
d2 = data['Col_1'][i+1]
c1 = data['Col_4'][i]
c2 = data['Col_4'][i+1]
flag = 0
if(all(x in d2 for x in d1)):
flag = 1
g2 = (flag == 1)&(c2>c1)
v1.append(g1)
v2.append(g2)
data['new_cond1'] = v1
data['new_cond2'] = v2
data['Final_flag'] = (data['new_cond1']==True)&(data['new_cond2']==True)
data_output = data[data['Final_flag']==True]
但我最终没有得到预期的输出,而是输出中还存在一些额外的行。有人可以帮我提取预期输出中提到的行。
更新 2:
当我将以下内容添加到上述数据框时:
**Col1** **Col2** **Col3** **Col4**
pigeon Z st01 0
pigeon,parrot Z st01 1
dove,parrot Z st01 1
pigeon,parrot Z st01 1
pigeon,parrot,dove Z st01 2
预期的结果还包括:
pigeon,parrot,dove Z st01 2
虽然 "pigeon,parrot,dove" 行的 max(Col4) 不大于连续组内的最大计数 (Col4),但它仍包含在输出中。 我认为这是因为 Col1 的类别也很重要。也就是说,由于新添加的行具有不同类别的单词“pigeon,parrot,dove”。
提前致谢!
【问题讨论】:
标签: python pandas dataframe design-patterns