Pandas数据帧行删除

时间:2014-02-26 16:31:09

标签: pandas

我正在尝试修复csv文件 需要根据几个条件删除一些数据行 假设您有以下数据框:

-A ---- -----乙Ç
000 --- 0 ----- 0
000 --- 1个----- 0
001 --- 0 ----- 1
011 --- 1个----- 0
001 --- 1 ----- 1

如果两行或更多行具有共同的列A,我希望将列B设置为1的行保留 生成的数据框应如下所示:

-A ---- -----乙Ç
000 --- 1个----- 0
011 --- 1个----- 0
001 --- 1 ----- 1

我已经尝试过merge和drop_duplicates,但似乎无法获得我需要的结果。不确定列B = 1的行是否在B = 0的行之后.drop_duplicates的take_last参数看起来很有吸引力,但我不认为它适用于此。
任何建议都将不胜感激。
谢谢。

2 个答案:

答案 0 :(得分:0)

不是直截了当,但这应该有效

DF = pd.DataFrame({'A' : [0,0,1,11,1], 'B' : [0,1,0,1,1], 'C' : [0,0,1,0,1]})

DF.ix[DF.groupby('A').apply(lambda df: df[df.B == 1].index[0] if len(df) > 1 else df.index[0])]
    A  B  C
1   0  1  0
4   1  1  1
3  11  1  0

注意:

  • groupby将DF划分为具有唯一A值的行组,即A = 0(2行),A = 1(2行)和A = 11(1行)的组
  • 应用然后调用每个组的功能并同化结果
  • 在函数(lambda)中,如果组中有多行,我正在寻找值为B == 1的行的索引,否则我使用默认行的索引
  • apply的结果是一个索引值列表,如果组中有多行,则表示B == 1的行,否则为给定A的默认行
  • 索引值随后用于通过ix operator
  • 访问相应的行

答案 1 :(得分:0)

能够在熊猫周围编织以获得我想要的结果。 这不是很漂亮,但它完成了工作

res = DataFrame(columns=('CARD_NO', 'STATUS'))
for i in grouped.groups:
    if len(grouped.groups[i]) > 1:
        card_no = i
        print card_no
        for a in grouped.groups[card_no]:
            status = df.iloc[a]['STATUS']
            print 'iloc:'+str(a) +'\t'+'status:'+str(status)
            if status == 1:
                print 'yes'

                row = pd.DataFrame([dict(CARD_NO=card_no, STATUS=status), ])
                res = res.append(row, ignore_index=True)
            else:
                print 'no'
    else:
        #only 1 record found
        #could be a status of 0 or 1
        #add to dataframe
        print 'UNIQUE RECORD'
       card_no = i
        print card_no
        status = df.iloc[grouped.groups[card_no][0]]['STATUS']
        print grouped.groups[card_no][0]
        #print status
        print 'iloc:'+str(grouped.groups[card_no][0]) +'\t'+'status:'+str(status)

        row = pd.DataFrame([dict(CARD_NO=card_no, STATUS=status), ])
        res = res.append(row, ignore_index=True)
print res