【问题标题】:Iterate through dataframe and create new dataframe every time condition is met每次满足条件时遍历数据框并创建新的数据框
【发布时间】:2020-03-02 02:06:34
【问题描述】:

从 SQL 查询中,我提取了商店中发生的活动列表,其中一列有一个名为“STATUS”的标签。

每次“状态”标签更改时,我都想向下移动数据框并拉出整行

  • 我从查询中创建了一个数据框并将其命名为 df
  • 将列类型更改为我需要的类型
  • 创建了所有列标题的列表
  • 使用该列表创建了一个我打算附加到的空数据框
  • 尝试使用上述条件创建一个 for 循环
    headerlist = df.columns.values.tolist() 

    newdf = pd.DataFrame(columns=headerlist)

    for index, row in df.iterrows():

        if df.STATUS[i] != df.STATUS[i-1]:
            newdf = newdf.append(i)

我在这里上传了一张图片,它代表了我想要实现的目标。

提前谢谢你

https://imgur.com/a/XXEOlKs

【问题讨论】:

  • 你能举一个可运行的例子吗?
  • 所以你正在遍历一个 DataFrame,如果第 n 行中的 STATUS 列与第 n-1 行不同,你想将它附加到不同的 DataFrame 吗?如果这是预期的结果,您看到的结果是什么?

标签: python pandas for-loop


【解决方案1】:

试试这个

df[df['STATUS'].ne(df['STATUS'].shift().bfill())]

【讨论】:

  • 感谢您的回答。 drop_duplicates 不起作用,因为当您向下查看列表时,“状态”值会重复。某些事情可能会从 IPRG 到 WORK 回到 IPRG,我想同时获得这两个休息时间
  • 根据此附加信息进行了编辑。请尝试更新。
  • 这里不需要填充
【解决方案2】:

不确定这是最好的答案:(我对 Python 也有点陌生)

假设你的原始数据框是 df

for even, odd in zip(df.iloc[::2], df.iloc[1::2]):
    if even.status!=odd.status:
        #do you append here

您应该提供一个可运行的 df 示例,以便我们可以在发布之前运行我们的代码以确保它确实有效

【讨论】:

    【解决方案3】:

    我想我明白了!我在发帖前试了一个小时,一发帖就被点击了

    它比 for 循环简单得多。

    我创建了一个名为“MATCH”的新列,它具有一个布尔值,用于判断“STATUS”的新值是否与前一个值相等。

    然后我只过滤 df.STATUS == False

    '''蟒蛇 df['MATCH'] = df.STATUS.eq(df.STATUS.shift())'''

    【讨论】:

      猜你喜欢
      • 2021-01-28
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 2020-02-07
      • 1970-01-01
      • 2022-01-03
      • 2021-03-31
      相关资源
      最近更新 更多