有条件地遍历 Pandas 数据框

Posted

技术标签:

【中文标题】有条件地遍历 Pandas 数据框【英文标题】:Iterating through Pandas Data Frame with conditions 【发布时间】:2015-04-19 13:31:04 【问题描述】:

我正在尝试遍历一个大型数据框。但是,我不知道如何包含一些条件。以下是我的数据框示例:

       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(),但我只是浏览了整个数据框并没有得到任何结果。

谢谢。

罗德里戈

【问题讨论】:

那么您发布的示例数据框的输出是什么?一个空列表?请展示一个具有所需(非平凡)输出的示例。这样问题就更清楚了。 【参考方案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】:

这可以在不使用 iterrows 的情况下完成。以上都将起作用。另一种方法是使用包 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()

【讨论】:

【参考方案3】:
>>> df[(df.iloc[:, 1] - df.iat[1, 1]) < 5000][3].tolist()
[1.0, 0.0, 0.5, 1.0, 0.0]

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

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

【讨论】:

【参考方案4】:

非常感谢各位,

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

谢谢。

【讨论】:

以上是关于有条件地遍历 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历 Pandas 数据帧并根据条件复制到新数据帧

如何循环遍历熊猫数据框,并有条件地将值分配给变量的一行?

如何有条件地转换熊猫数据框列

遍历 Pandas 数据框 [重复]

Python pandas 遍历数据框

循环遍历 Pandas 数据框以填充列表(Python)