2014-02-26 197 views
0

我想修复一个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

我试验过merges和drop_duplicates,但似乎无法得到我需要的结果。不能确定列B = 1的行将在B = 0的行之后。drop_duplicates的take_last参数看起来很有吸引力,但我认为它不适用于此。
任何意见将不胜感激。
谢谢。

+0

不应该'DF1 = df.loc [df.b == 1]'给你你想要什么,或者你认为会有行,你有'A'和'B'的唯一值仍然是0? – EdChum

+0

我也想保留行的值为A是唯一的,而B的值是0. – Zihs

+0

本质上,我想从df = pd.DataFrame({'A':['000','000' ,'001','011','001','111'],'B':[0,1,1,1,0,0]})至df1 = pd.DataFrame({'A':[ '000','001','011','111'],'B':[1,1,1,0]}) – Zihs

回答

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 = 0(2行),A = 1(2行)和A = 11(1行)
  • 然后应用然后调用每个组的功能并同化结果
  • 在函数(lambda)中,我正在查找带有v Alue B == 1如果组中有多于一行,否则我使用默认行的索引
  • apply的结果是一个索引值列表,如果多于一个排在其他组给定一个
  • 那么指数值由九运营商
+0

这对于给出的例子非常有效。在实际大型数据集上使用它时,出现以下错误:IndexError:索引0超出轴0的大小为0的界限。任何想法为什么? – Zihs

+0

我的数据集包含带标题的500k行。示例行'6018956795013151,1310392,1,0' – Zihs

+0

另外,你可以通过你的答案的步骤走过我吗?我无法理解它。 – Zihs

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