【问题标题】:Pandas: Resample a dataframe given a list of indexes that are not evenly spacesPandas:在给定非均匀空间索引列表的情况下对数据帧重新采样
【发布时间】:2022-12-05 22:22:09
【问题描述】:

给定一个数据框 df: pd.Dataframe 和来自 df.index 的索引的一个子集 selected_indexes,我如何使用应用于每个间隔 selected_indexes[i], selected_indexes[i+1]max 运算符对 df 进行重新采样?

例如,给定一个数据框:

   col
0    5
1    0
2    3
3    3
4    7
5    9
6    3
7    5
8    2
9    4

并选择索引“selected_indexes = [0, 5, 6, 9]”并在每个间隔之间应用 col 列的最大值(假设我们保留终点并排除起点),我们应该得到:

   col
0    5
5    9
6    3
9    5

例如,9行是用7, 8, 9 \in (6, 9]行中的max(5, 2, 4)创建的。

【问题讨论】:

  • 请提供一个最小的可重现示例和匹配的预期输出以明确您的确切需求
  • 逻辑还是不清楚,为什么保留3,把4改成5?
  • 检查我更新的答案是否是你想要的

标签: python pandas dataframe


【解决方案1】:

新诠释

selected_indexes = [0, 5, 6, 9]
group = (df.index.to_series().shift() # make groups
           .isin(selected_indexes)    # based on
           .cumsum()                  # previous indices
        )

# get max per group
out = df.groupby(group).max().set_axis(selected_indexes)

输出:

   col
0    5
5    9
6    3
9    5

以前对问题的解释

您可能需要 rolling.max,而不是重新采样:

out = df.loc[selected_indexes].rolling(3, center=True).max()

或者,如果您希望将 ±1 应用于数据选择:

out = df.rolling(3, center=True).max().loc[selected_indexes]

例子:

np.random.seed(0)
df = pd.DataFrame({'col': np.random.randint(0, 10, 10)})
selected_indexes = [1, 2, 3, 5, 6, 8, 9]

print(df)

   col
0    5
1    0
2    3
3    3
4    7
5    9
6    3
7    5
8    2
9    4


out = df.loc[selected_indexes].rolling(3, center=True).max()
print(out)

   col
1  NaN
2  3.0
3  9.0
5  9.0
6  9.0
8  4.0
9  NaN

out2 = df.rolling(3, center=True).max().loc[selected_indexes]
print(out2)

   col
1  5.0
2  3.0
3  7.0
5  9.0
6  9.0
8  5.0
9  NaN

【讨论】:

  • 我不确定我是否理解正确。当您将最大值应用于第 9 行的“4”时,您应该得到 4。当您将最大值应用于 8 时,由于它的间隔 (6, 8],您应该得到 max(5, 2),即 5。
  • @Jeremy 这就是为什么您必须提供一个有意义的示例和匹配的预期输出(最好分解一两个计算示例)。我的解读你的问题不一定是你想要的;)
  • @mozaway 你是对的,我编辑并试图更明确一点。
猜你喜欢
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 2017-09-19
  • 2018-05-06
  • 2019-01-30
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多