【问题标题】:How to extract data from data frame when value of column change列值更改时如何从数据框中提取数据
【发布时间】:2020-03-23 04:30:12
【问题描述】:

当值从 0 变为 1 时,我想提取部分数据帧。

logic1:当值从0变为1时,开始保存数据,直到值再次变为0。(也指向1之前和1之后)

logic2:当值从0变为1时,开始保存数据,直到值再次变为0。(1之前和1之后不需要保存点)

仅当flag的第一次值从0变为1时才保存数据,之后如果再次从0变为1则不需要做任何事情

df=pd.DataFrame({'value':[3,4,7,8,11,1,15,20,15,16,87],'flag':[0,0,0,1,1,1,0,0,1,1,0]})

Desired output:
df_out_1=pd.DataFrame({'value':[7,8,11,1,15]})

Desired output:
df_out_2=pd.DataFrame({'value':[8,11,1]})

【问题讨论】:

  • 你能详细说明一下逻辑吗?
  • 那么这个变化的触发因素是什么?您可以使用df[df['flag'] == 1] 并将其保存到每个触发器中所需的变量中。
  • @dzakyputra 你说的是简单的过滤器,这样我会得到带有标志 1 的行,这不是我的要求

标签: python-3.x pandas numpy pandas-groupby


【解决方案1】:

想法是获得10连续组的连续组到s,仅过滤1组并通过最小值比较获得第一个1组:

df = df.reset_index(drop=True)
s = df['flag'].ne(df['flag'].shift()).cumsum()
m = s.eq(s[df['flag'].eq(1)].min())

df2 = df.loc[m, ['value']]
print (df2)
   value
3      8
4     11
5      1

然后用 aff 过滤值并将1 删除为默认RangeIndex

df1 = df.loc[(df2.index + 1).union(df2.index - 1), ['value']]
print (df1)
   value
2      7
3      8
4     11
5      1
6     15

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多