【问题标题】:Delete rows in subsequences that contain leading zeros in a dataframe删除数据框中包含前导零的子序列中的行
【发布时间】:2018-01-30 10:42:13
【问题描述】:

我有一个带有时间序列格式的数据框

A  B  C  201401 201402 201403

a1 b1 c1  100    200    300
a2 b2 c2  0      250     0

我已使用Pandas.melt 将这些数据展平,并得到以下格式。

A  B  C  YYYYMM Value
a1 b1 c1 201401 100
a1 b1 c1 201402 200
a1 b1 c1 201403 300
a2 b2 c2 201401 0
a2 b2 c2 201402 250
a2 b2 c2 201403 0

现在对于 [A B C] 的特定组合,我只想要时间序列非零值开始。所以我的输出应该是这样的。

A  B  C  YYYYMM Value
a1 b1 c1 201401 100
a1 b1 c1 201402 200
a1 b1 c1 201403 300
a2 b2 c2 201402 250
a2 b2 c2 201403 0

我试过了,

df.groupby(['A','B','C']).apply(lambda x: x['Value'][np.where(x['Value']>0)[0][0]:]

这只是给了我时间序列,并不意味着就地更改。 我应该怎么做才能做到这一点?

【问题讨论】:

  • 为什么不直接过滤数据框df = df[df['Value'] > 0]
  • df.melt(id_vars=['A', 'B', 'C']).query('value > 0')?
  • Hi 这将消除时间序列中的所有零值。我只想消除前导零。我已更改示例以供参考。
  • 我在你的例子中没有看到前导零,数字中的前导零应该像这样 0100
  • 如果您将 A、B、C 视为一个组,并且根据我的 250 具有值为 0,250,0 的时间序列,则 0 是领先的零消除时间序列。

标签: python-2.7 pandas dataframe


【解决方案1】:

我继续你的分组然后过滤的想法。基本思想是假设每个组已经按日期排序,并找到第一个非零值的索引。然后取消组合并清理。

def applyFunc(row):
    row_values = np.array(row.Value)
    first_non_zero_index = next((i for i, x in enumerate(row_values) if x), None)
    return row.iloc[first_non_zero_index:]

df.groupby(['A','B','C']).apply(applyFunc).drop(["A","B","C"],axis=1).reset_index().drop("level_3",axis=1)

使用来自https://stackoverflow.com/a/19502403/2750819的sn-p

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2021-08-21
    相关资源
    最近更新 更多