通过CSV读取器迭代切片数据帧

时间:2015-04-15 00:24:16

标签: csv pandas

我有一个包含508383行的数据框。我只展示前10行。

    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 4176144

我想迭代每一行并检查第一行的第2列的值到下一行的值。我想检查这些值之间的差异是否小于5000.如果差值大于5000,那么我想将数据帧从第一行切片到前一行,并将其作为子集数据帧。

然后,我想重复此过程并创建第二个子集数据框。我只是设法通过将CSV阅读器与Pandas结合使用来完成这项工作。

这是我的代码:

#!/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

我想知道是否有更好的方法来执行此过程)而不必每次都重复代码)并获取我需要的所有子集数据帧。

感谢。

罗德里戈

1 个答案:

答案 0 :(得分: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

这是有效的,因为每次新组开始时比较都会给我们一个新的True,当我们得到累积总和时,我们得到的是一个有效的组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