2015-09-23 63 views
2

讓Pandas Dataframe df在下面,我如何找到值爲6和10的行?按設定值選擇Pandas Dataframe

0 1 2 3 4 5 6 
0 11 1 3 4 6 8 10 
1 11 1 3 4 6 8 11 
2 11 1 3 4 6 8 0 
3 11 1 3 4 6 9 10 
4 11 1 3 4 6 9 11 
5 11 1 3 4 6 9 0 
6 11 1 3 4 6 10 10 
7 11 1 3 4 6 10 11 
8 11 1 3 4 6 10 0 
9 11 1 3 4 7 8 10 

我可以得到這些線與解決方案基於集:

>>> df.iloc[[i for i, s in enumerate(df.itertuples()) if {6, 10} <= set(s)]] 

    0 1 2 3 4 5 6 
0 11 1 3 4 6 8 10 
3 11 1 3 4 6 9 10 
6 11 1 3 4 6 10 10 
7 11 1 3 4 6 10 11 
8 11 1 3 4 6 10 0 

我的問題是:是否有大熊貓更好的方式在兩種給定值存在的線來獲得真實的嗎?一些諸如:

df.where({6, 10} <= df) 

的數據例如:

pandas.DataFrame.from_dict({0: {0: 11, 1: 11, 2: 11, 3: 11, 4: 11, 5: 11, 6: 11, 7: 11, 8: 11, 9: 11}, 
1: {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1}, 
2: {0: 3, 1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3, 9: 3}, 
3: {0: 4, 1: 4, 2: 4, 3: 4, 4: 4, 5: 4, 6: 4, 7: 4, 8: 4, 9: 4}, 
4: {0: 6, 1: 6, 2: 6, 3: 6, 4: 6, 5: 6, 6: 6, 7: 6, 8: 6, 9: 7}, 
5: {0: 8, 1: 8, 2: 8, 3: 9, 4: 9, 5: 9, 6: 10, 7: 10, 8: 10, 9: 8}, 
6: {0: 10, 1: 11, 2: 0, 3: 10, 4: 11, 5: 0, 6: 10, 7: 11, 8: 0, 9: 10}}) 

編輯

該數據幀是隻有一小段我的真實數據。 0到11之間的整數可以在每行中出現0到2次。例如,在這些行中,值4,8和11每個出現兩次。

 0 1 2 3 4 5 6 
100  11 1 4 4 8 8 11 
343  11 2 4 4 8 8 11 
505  11 3 3 4 8 8 11 
586  11 3 4 4 8 8 11 
1558 1 1 4 4 8 8 11 
+0

您的數據是否包含重複的6s或10s? – Anzel

+0

是的,數據可以包含重複的值。 – msampaio

+0

但是你會有隻有重複6s/10s的行嗎? – EdChum

回答

1

您可以使用isin來測試成員,然後調用dropna並通過thresh=2只顯示其中至少2個非NaN值存在的行:

In [20]: 
df[df.isin([6,10])].dropna(thresh=2) 

Out[20]: 
    0 1 2 3 4 5 6 
0 NaN NaN NaN NaN 6 NaN 10 
3 NaN NaN NaN NaN 6 NaN 10 
6 NaN NaN NaN NaN 6 10 10 
7 NaN NaN NaN NaN 6 10 NaN 
8 NaN NaN NaN NaN 6 10 NaN 

我認爲實際上這是更好地測試每個值和應用any

In [41]: 
df.apply(lambda x: (x == 6).any() & (x == 10).any(), axis=1) 

Out[41]: 
0  True 
1 False 
2 False 
3  True 
4 False 
5 False 
6  True 
7  True 
8  True 
9 False 
dtype: bool 

爲3倍的值,你可以這樣做:

df.apply(lambda x: (x==5).any() & (x == 6).any() & (x == 10).any(), axis=1) 
+0

我如何調整代碼以找到不在數據框中的集合?例如,'[5,6,10]'。我試過'df [df.isin([5,6,10])]。dropna(thresh = 3)'並且獲得了第6行。 – msampaio

+0

你的意思是不是5,6,10的值? – EdChum

+0

我只想找出三個值(5,6和10)存在的行。 – msampaio