通过条件迭代Pandas数据帧

时间:2015-04-19 13:31:04

标签: python pandas

我正在尝试迭代一个大型数据框。但是,我无法弄清楚如何包含一些条件。以下是我的数据框的示例:

       0        1        2    3
0  chr3R  4174822  4174922    1.0
1  chr3R  4175400  4175500    0.0
2  chr3R  4175466  4175566    0.5
3  chr3R  4175521  4175621    1.0
4  chr3R  4175603  4175703    0.0

我想遍历这些行并找到x行第1列与第1行第1列的差异小于5000的行。如果x行和第1行之间的差异小于5000,则选择行x到列1的第3列的值放入列表中。然后,我想在整个数据框中迭代这个条件,并列出第3列值的列表。

我尝试使用iterrows(),但我只是浏览整个数据框,什么都没有。

感谢。

罗德里戈

4 个答案:

答案 0 :(得分:2)

这可以在不使用iterrows的情况下完成。以上都可行。另一种方法是使用来自package numpy的np.where。这是一个例子。 PL。根据您的要求修改。

    import numpy as np 
    df['newcol'] = np.where(df[1]- df[1].iloc[0] <  5000, 1, df[1])
    dfList = df['newcol'].tolist()

答案 1 :(得分:1)

让我们获取您的数据集,再添加几行。

>>> import pandas as pd
>>> data = pd.DataFrame([
...     ['chr3R', 4174822, 4174922, 1.0],
...     ['chr3R', 4175400, 4175500, 0.0],
...     ['chr3R', 4175466, 4175566, 0.5],
...     ['chr3R', 4175521, 4175621, 1.0],
...     ['chr3R', 4175603, 4175703, 0.0],
...     ['chr3R', 5005603, 4175703, 0.0],   # col 1 is more than 5000 away
...     ['chr3R', 6005603, 4175703, 0.0],   # col 1 is more than 5000 away
... ])

添加最后两行以显示行的示例,其中列1比4174822(第1列的第一个值)高出5000以上。

您可以按以下方式筛选出第一个值4174822的5,000以内的值:

>>> subset = data[data[1] - data[1][0] < 5000]
>>> subset
       0        1        2    3
0  chr3R  4174822  4174922  1.0
1  chr3R  4175400  4175500  0.0
2  chr3R  4175466  4175566  0.5
3  chr3R  4175521  4175621  1.0
4  chr3R  4175603  4175703  0.0

...然后使用.iterrows()进行迭代。

>>> for index, row in subset.iterrows():
...     # do something with row

答案 2 :(得分:0)

>>> df[(df.iloc[:, 1] - df.iat[1, 1]) < 5000][3].tolist()
[1.0, 0.0, 0.5, 1.0, 0.0]

df.iloc[:, 1]选择第1列中的所有行,使用df.iat[1, 1]减去第一行第一列的值,然后过滤小于5000的值。

最后的[3]然后选择第三列(将返回一个系列)。但是因为你想要一个列表,只需将.tolist()附加到结果中。

答案 3 :(得分:0)

非常感谢大家,

但是,我需要创建一个列表列表。我可以抓住与第一行相差5000的第一行。我需要获取相差5000的下一行。迭代这个过程的最佳方法是什么?

感谢。

相关问题