Python数据框遍历行

数据挖掘 Python 熊猫 数据框 模式识别
2022-02-27 17:04:47

数据集

**Col1**                                 **Col2**      **Col3**        
dog                                        Z             st02          
dog,cat                                    Z             st02          
dog,bat,cat                                Z             st02          
bat,cat,elephant                           Y             st02          
dog,bat,cat,elephant                       Y             st02          
tiger                                      Z             st01          
pigeon                                     Z             st01          
pigeon,parrot                              Z             st01          
dove,parrot                                Z             st01          
pigeon,parrot                              Z             st01          
pigeon,parrot,dove                         Z             st01          
lion,leopard,cheetah                       Z             st01          
tiger,lion,leopard,cheetah                 Z             st01          
dog,tiger,cheetah                          Y             st01          
dog,tiger,leopard,cheetah                  Y             st01          
eagle,jaguar,Kangaroo,zebra                Z             st02          
cheetah,eagle,jaguar,Kangaroo,zebra        Z             st02          

预期的输出是:

**Col1**                                 **Col2**       **Col3**      
dog,bat,cat                                Z              st02          
dog,bat,cat,elephant                       Y              st02          
tiger,lion,leopard,cheetah                 Z              st01          
dog,tiger,leopard,cheetah                  Y              st01          
cheetah,eagle,jaguar,Kangaroo,zebra        Z              st02          
pigeon,parrot,dove                         Z              st01          

为了提取上述行作为输出,我尝试跟踪模式并使用以下逻辑:

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['Col2'][i]
    y = data['Col2'][i+1]
    t1 = data['Col3'][i]
    t2 = data['Col3'][i+1]
    g1 = (x == y) & (t1==t2)
    d1 = data['Col1'][i]
    d2 = data['Col1'][i+1]
    c1 = data['Col4'][i]
    c2 = data['Col4'][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]  

但我最终没有得到预期的输出,输出中也有很少的额外行。有人可以帮我提取预期输出中提到的行。


从数据集中,我试图提取 1) 由逗号分隔的动物数量最多的行(或者在提到鸽子/鹦鹉/鸽子的地方考虑鸟类)。2) 不一定是每个 Col2 或 Col3 最多只能有一个动物数量,甚至可能有多个示例,如第 1 行的情况。1 和行号。5 在第 2 列和第 3 列中具有相同的值。这是因为第 1 行和第 1 行的动物类别不同。5. 希望清楚。

提前致谢!

1个回答

如果 Col1 是 Col1 中另一条记录的子集,您似乎想减少数据中的记录。首先,您可以按字母顺序对列进行排序,然后使用下面的函数。

import pandas as pd
df = pd.DataFrame()

df['Col1']  = ['X','X,Y','Z','Z,W']

def test(x):
    return df.Col1.apply(lambda y: y in x).sum()>1

mask = df.Col1.apply(lambda x: test(x))

df[mask]

Apply 是遍历 pandas 中记录的方法。您可以嵌套应用函数来有效地解决您的任务。

注意:如果您的数据集中有重复项,它也会屏蔽这些重复项。您需要先使用 df.drop_duplcates(subset='Col1') 对数据集进行重复数据删除

或者

如果你想保持其他两列的可变性,那么你可以通过使用整个df的apply函数,axis=0。请参阅文档