2015-04-15 46 views
0

我有一個包含508383行的數據幀。我只顯示前10行。通過CSV閱讀器迭代切片數據幀

0  1  2 

0 chr3R 4174822 4174922
1 chr3R 4175400 4175500
2 chr3R 4175466 4175566
3 chr3R 4175521 4175621
4 chr3R 4175603 4175703
5 chr3R 4175619 4175719
6 chr3R 4175692 4175792
7 chr3R 4175889 4175989
8 chr3R 4175966 4176066
9 chr3R 4176044 417614 4

我想遍歷每一行,並檢查第一行的列#2的值到下一行的值。我想檢查這些值之間的差異是否小於5000.如果差異大於5000,那麼我想要將數據幀從第一行切片到前一行,並將其作爲子集數據幀。

然後我想重複這個過程並創建第二個子集數據框。我只能通過將CSV閱讀器與熊貓結合使用來完成此項任務。

這裏是我的代碼:

#!/usr/bin/env python 

import pandas as pd 

data = pd.read_csv('sort_cov_emb_sg.bed', sep='\t', header=None, index_col=None) 

import csv 

file = open('sort_cov_emb_sg.bed') 

readCSV = csv.reader(file, delimiter="\t") 

first_row = readCSV.next() 
print first_row 

count_1 = 0 
while count_1 < 100000: 
    next_row = readCSV.next() 
    value_1 = int(next_row[1]) - int(first_row[1]) 
    count_1 = count_1 + 1 
    if value_1 < 5000: 
     continue 
    else: 
     break 

print next_row 
print count_1 
print value_1 

window_1 = data[0:63] 
print window_1 

first_row = readCSV.next() 
print first_row 

count_2 = 0 
while count_2 < 100000: 
    next_row = readCSV.next() 
    value_2 = int(next_row[1]) - int(first_row[1]) 
    count_2 = count_2 + 1 
    if value_2 < 5000: 
     continue 
    else: 
     break 

print next_row 
print count_2 
print value_2 

window_2 = data[0:74] 
print window_2 

我想知道是否有更好的方法來做到這一點的過程),而每一次重複的代碼),並得到我需要的所有子集的數據幀。

謝謝。

羅德里戈

+0

我記得看到類似的問題,有人想出了一個很好的答案,但我找不到它。作爲開始,這將爲您提供差異大於5000的每一行。data [abs(data [「2」] - data [「2」]。shift())> 5000]。我想你可以迭代並相應切片 –

回答

3

這是compare-cumsum-groupby模式的又一個例子。只使用行你告訴(因此改變DIFF爲100,而不是5000):

jumps = df[2] > df[2].shift() + 100 
grouped = df.groupby(jumps.cumsum()) 
for k, group in grouped: 
    print(k) 
    print(group) 

產生

0 
     0  1  2 
0 chr3R 4174822 4174922 
1 
     0  1  2 
1 chr3R 4175400 4175500 
2 chr3R 4175466 4175566 
3 chr3R 4175521 4175621 
4 chr3R 4175603 4175703 
5 chr3R 4175619 4175719 
6 chr3R 4175692 4175792 
2 
     0  1  2 
7 chr3R 4175889 4175989 
8 chr3R 4175966 4176066 
9 chr3R 4176044 4176144 

這工作,因爲比較給了我們一個新的一個新的真正的每一次我們可以得到什麼是有效的組ID,我們可以將其組合:

>>> jumps 
0 False 
1  True 
2 False 
3 False 
4 False 
5 False 
6 False 
7  True 
8 False 
9 False 
Name: 2, dtype: bool 
>>> jumps.cumsum() 
0 0 
1 1 
2 1 
3 1 
4 1 
5 1 
6 1 
7 2 
8 2 
9 2 
Name: 2, dtype: int32