2017-08-17 33 views
1

我是Python新手 - 熊貓,目前正試圖用它來檢查DataFrame中的數據是否連續。例如:什麼是最好的方式來告訴熊貓DataFrame丟失的行?

thread sequence  start  end 
14  1  114 1647143 1672244 
15  1  115 1672244 1689707 
16  1  116 1689707 1713090 
17  1  118 1735352 1760283 
18  1  119 1760283 1788062 
19  1  120 1788062 1789885 
20  1  121 1789885 1790728 

每一行擁有4列,在通用序列應與1步增加,所以如果一切是正確的,它看起來像116117118 ......,就像一個範圍()函數。但是,這裏的示例缺少序列== 117的行。

我試圖找到它,但我不知道該怎麼做。如果我只是逐一檢查序列,那將是低效的。期望的輸出是告訴缺失的行或用NaN填充缺失的行。

任何好的提示或建議都會有幫助。

回答

2

使用RangeIndex更快的方法:

In [415]: seq = pd.RangeIndex(df.sequence.min(), df.sequence.max()) 

In [416]: seq[~seq.isin(df.sequence)].values 
Out[416]: array([117]) 
+0

非常感謝!正是我需要的。 – Castor

+0

@Castor如果你只是想要的值而不是數據框,你不應該使用接受的答案。它非常緩慢。 –

+0

@COLDSPEED是的,我注意到你說的是'最快的方法',看起來好像要慢得多的DataFrame然後找到NaN裏面,我會做一個基準測試它。感謝提示。 – Castor

1

我希望看到您想要的輸出,但請檢查下面。

test = df.set_index('sequence').reindex(range(df['sequence'].min(), df['sequence'].max())).reset_index() 
print(test) 

    sequence thread  start  end 
0  114  1.0 1647143.0 1672244.0 
1  115  1.0 1672244.0 1689707.0 
2  116  1.0 1689707.0 1713090.0 
3  117  NaN  NaN  NaN 
4  118  1.0 1735352.0 1760283.0 
5  119  1.0 1760283.0 1788062.0 
6  120  1.0 1788062.0 1789885.0 

print(test[test['thread'].isnull()]['sequence'].tolist()) 

[117] 
+0

謝謝!對於理解如何用熊貓重置索引非常有幫助 – Castor

+0

對不起,我重新選擇答案,因爲速度更快,但無論如何,你的方式更容易理解,謝謝! – Castor

+0

@Castor沒問題!確實,使用'RangeIndex'確實是更好的答案。 – su79eu7k

3

如果你只是想獲得丟失的序列值,你可以做這樣的事情:

>>> seq = pd.DataFrame(np.arange(df.iloc[0].sequence, df.iloc[-1].sequence)) 
>>> seq[~seq[0].isin(df.sequence)] 
    0 
3 117 
+0

是的,缺少值是期望的輸出,非常感謝! – Castor

相關問題