2016-05-09 91 views
2

從pandas.Dataframe行給定一個pandas.DataFrame刪除基於項

| Col_A | Col_B | Other_Columns 
0 | A0 | B0 | … 
1 | A1 | B1 | … 
2 | A2 | B2 | … 
3 | A3 | B3 | … 
… | …  | …  | … 

我一直試圖保持這種DataFrame的一個子集:除暴安良其中兩個AB條目的唯一行(例如,如果6行說,這兩個值A6B6不會出現其他地方在DataFrame,我們要刪除此行)

我不想放棄重複。此外,我不想獲得唯一的值(如果我理解的很好,就像將列表轉換爲集合一樣,我是對嗎?),而是隻顯示一次的值。

在這一點上,這是我有:

counts = df[['Col_A','Col_B']].stack().value_counts(ascending=True) 
myList = [0] + [item for item in counts[counts.values == 1].index] 
toRemove = [] 
for i in df.index: 
    if (df.at[i,'Col_A'] and df.at[i, 'Col_B']) in myList: 
     toRemove.append(i) 
final_df = df[~df.index.isin(toRemove)] 

這是不是很有效(數據幀是相當大的> 1000萬線)必須有一個更Python戰略,涉及的內置功能熊貓,對吧? 另外,我不太確定第一行是正確的:通過堆疊兩列,我是否確保對兩列的條目執行計數?

請不要猶豫,如果你需要更多的信息或如果我的寫作不清楚給你。

非常感謝您抽出寶貴時間:-)

+0

@unutbu,國際海事組織它不是一個副本。 OP希望保留__either__列中的值不唯一的行 – MaxU

+0

@MaxU:我的錯誤;謝謝重新開放。 – unutbu

回答

1

怎麼樣這樣的:

In [75]: df = pd.DataFrame(np.random.randint(0,100,size=(10, 3)), columns=list('abc')) 

In [76]: df 
Out[76]: 
    a b c 
0 37 85 17 
1 19 0 11 
2 51 20 65 
3 59 92 65 
4 48 15 91 
5 21 50 44 
6 61 94 49 
7 51 6 88 
8 89 72 40 
9 5 51 79 

In [77]: c = df[['a','b']].stack().value_counts() 

In [78]: c 
Out[78]: 
51 3 
94 1 
15 1 
37 1 
6  1 
72 1 
50 1 
21 1 
5  1 
48 1 
61 1 
19 1 
20 1 
85 1 
89 1 
59 1 
92 1 
0  1 
dtype: int64 

In [79]: c[c>1] 
Out[79]: 
51 3 
dtype: int64 

In [80]: vals = c[c>1].index 

In [81]: df[(df['a'].isin(vals)) | (df['b'].isin(vals))] 
Out[81]: 
    a b c 
2 51 20 65 
7 51 6 88 
9 5 51 79 

UPDATE:

當你做if (df.at[i,'Col_A'] and df.at[i, 'Col_B']) in myList:檢查你是不是檢查它相當正確...

這是發生了什麼事:

In [90]: df.at[0, 'a'], df.at[0, 'b'] 
Out[90]: (37, 85) 

In [91]: (df.at[0, 'a'] and df.at[0, 'b']) 
Out[91]: 85 

所以你不能檢查它這樣

+0

非常感謝MaxU,你的建議答案很清楚,你的代碼很快。 我一直在玩它,但一個疑問依然存在:我得到一個完全不同的輸出,如果我嘗試遍歷數據幀指數的緩慢的方式做到這一點: 'keepIndex = []' 如果df.at [i,'a']或df.at [i,'b'] in vals: keepIndex.append(i)' 'final_df = df ['for i in df.index: ' df.index.isin(keepIndex)]' 我的代碼是否完成了其他的事情?我在這裏錯過了什麼嗎? – UniversalTraveller

+0

@UniversalTraveller,請在我的回答中閱讀「更新:」部分 – MaxU

+0

好的,非常感謝您的澄清:-)無論如何,您是否知道爲什麼? – UniversalTraveller