【问题标题】:How to get a value from of the previous row in a (sliced) pandas data frame?如何从(切片)熊猫数据框中的前一行获取值?
【发布时间】:2021-07-23 07:01:53
【问题描述】:

我有这个数据帧 (drr2),它是从我的主数据帧 (df) 中过滤出来的。

首先,我想获取所有之前或之前的行,这些行的值在 Diff_indexes >100 上。 (例如,例如 Diff_indexes >100 的第一行是索引为 234 的行,这意味着我对第 112 行感兴趣,依此类推)。

这是我的数据框:

drr2 =
           Var1                                Var2  Diff_indexes
105    26.312972  DrawRatingStimulationPleasantness1          10.0
109    30.046355  DrawRatingStimulationPleasantness2           4.0
112    31.029982  DrawRatingStimulationPleasantness3           3.0
234    76.220259  DrawRatingStimulationPleasantness2         122.0
237    77.719969  DrawRatingStimulationPleasantness3           3.0
240    78.286882  DrawRatingStimulationPleasantness2           3.0
243    79.270320  DrawRatingStimulationPleasantness3           3.0
385   139.242069  DrawRatingStimulationPleasantness2         142.0
388   141.291997  DrawRatingStimulationPleasantness3           3.0
511   186.265111  DrawRatingStimulationPleasantness5         123.0
644   232.106194  DrawRatingStimulationPleasantness2         133.0
647   233.306226  DrawRatingStimulationPleasantness3           3.0
776   266.145625  DrawRatingStimulationPleasantness3         129.0
909   328.336363  DrawRatingStimulationPleasantness4         133.0
1040  377.658295  DrawRatingStimulationPleasantness2         131.0
1043  378.774965  DrawRatingStimulationPleasantness3           3.0
1046  379.108252  DrawRatingStimulationPleasantness4           3.0
1174  423.064324  DrawRatingStimulationPleasantness2         128.0
1304  465.054045  DrawRatingStimulationPleasantness4         130.0
1307  466.571473  DrawRatingStimulationPleasantness3           3.0
1466  506.243939  DrawRatingStimulationPleasantness3         159.0
1469  507.643720  DrawRatingStimulationPleasantness2           3.0
1618  564.352222  DrawRatingStimulationPleasantness2         149.0
1748  606.106813  DrawRatingStimulationPleasantness5         130.0
1757  609.423391  DrawRatingStimulationPleasantness4           9.0
1762  609.706667  DrawRatingStimulationPleasantness2           5.0
1893  654.060668  DrawRatingStimulationPleasantness1         131.0
1896  655.294472  DrawRatingStimulationPleasantness2           3.0
2022  700.601474  DrawRatingStimulationPleasantness4         126.0
2161  761.392519  DrawRatingStimulationPleasantness5         139.0
2164  764.076032  DrawRatingStimulationPleasantness4           3.0
2167  764.293120  DrawRatingStimulationPleasantness3           3.0
2170  764.676851  DrawRatingStimulationPleasantness2           3.0
2173  765.043686  DrawRatingStimulationPleasantness1           3.0

我已经获得了 Diff_indexes > 100 的行的所有索引并将它们放在一个列表中。 这是我以前这样做的代码:

rows_max_idx= drr2[drr2['Diff_indexes']>100]
list_indexes= list(rows_max_idx.index.values)
# To add the last value to the list: 
x = drr2['Diff_indexes'].index[-1]
list_indexes.append(x)
print(list_indexes)

结果如下:

[234, 385, 511, 644, 776, 909, 1040, 1174, 1304, 1466, 1618, 1748, 1893, 2022, 2161, 2173]

这是我想要的结果: 想要的_df=

            Var1                                Var2  Diff_indexes
112    31.029982  DrawRatingStimulationPleasantness3           3.0
243    79.270320  DrawRatingStimulationPleasantness3           3.0
388   141.291997  DrawRatingStimulationPleasantness3           3.0
511   186.265111  DrawRatingStimulationPleasantness5         123.0
647   233.306226  DrawRatingStimulationPleasantness3           3.0
776   266.145625  DrawRatingStimulationPleasantness3         129.0
909   328.336363  DrawRatingStimulationPleasantness4         133.0
1046  379.108252  DrawRatingStimulationPleasantness4           3.0
1174  423.064324  DrawRatingStimulationPleasantness2         128.0
1307  466.571473  DrawRatingStimulationPleasantness3           3.0
1469  507.643720  DrawRatingStimulationPleasantness2           3.0
1618  564.352222  DrawRatingStimulationPleasantness2         149.0
1762  609.706667  DrawRatingStimulationPleasantness2           5.0
1896  655.294472  DrawRatingStimulationPleasantness2           3.0
2022  700.601474  DrawRatingStimulationPleasantness4         126.0
2170  764.676851  DrawRatingStimulationPleasantness2           3.0

fesired_df 应该分别有以下 16 个索引 (112、243、388、511、647、776、909、1046、1174、1307、1469、1618、1762、1896、2022、2170)

我希望你能帮助我, 提前谢谢你,

【问题讨论】:

  • 你能编辑你的问题并把想要的输出放在那里吗?我看到你也想添加最后一个元素?

标签: python pandas indexing


【解决方案1】:

试试:

print(
    df.loc[
        df["Diff_indexes"].gt(100).shift(-1, fill_value=False)
    ].index.tolist()
)

打印:

[112, 243, 388, 511, 647, 776, 909, 1046, 1174, 1307, 1469, 1618, 1762, 1896, 2022]

编辑:从索引中添加最后一个元素:

print(
    df.loc[
        df["Diff_indexes"].gt(100).shift(-1, fill_value=False)
    ].index.tolist()
    + [df.index[-2]]
)

打印:

[112, 243, 388, 511, 647, 776, 909, 1046, 1174, 1307, 1469, 1618, 1762, 1896, 2022, 2170]

【讨论】:

  • 非常感谢,它有效。但是您知道如何使用相同的 shift() 方法将最后一项附加到列表中吗? p.s.该列表应包含 16 项,最后一项不属于 ('Diff+indexes'>100) 的条件语句。您可以查看我附加到我的问题的代码。提前谢谢你^_^
  • 非常感谢 ^_^
【解决方案2】:

假设您只希望在带有Diff_indexes > 100 的行之前的行,您可以这样做:

drr2.iloc[[x - 1 for x in drr2[drr2.Diff_indexes > 100].index.values]]

基本上,这采用Diff_indexes > 100 行的索引位置(不是值),使用列表推导式获取前一个位置(通过将列表中的每个值减一),然后使用结果列表按索引位置切片数据帧(因此.iloc

【讨论】:

  • 我试过我得到这个错误:IndexError: indices are out-of-bounds
  • 问题是所需的索引不是立即 x-1,因为它们已经从更大的 df 切片,所以索引不按顺序!
  • 我没有使用索引值,我使用的是它们的位置(运行drr2[drr2.Diff_indexes > 100].index.values,你会发现它们不是你在 df 中的值),所以这应该有效.
  • 只有当第一行的 Diff_index > 100 时,您才会获得越界的索引值。在这种情况下,您可以从第 1 行(而不是 0)开始运行它。
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 2023-01-26
  • 2021-02-27
  • 2018-07-14
  • 2012-05-26
相关资源
最近更新 更多