有条件地遍历 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 数据框的主要内容,如果未能解决你的问题,请参考以下文章