2014-02-26 190 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