【问题标题】:If "n" not monolitic increasing replace "n" with "n-1"如果“n”不是单体递增,则将“n”替换为“n-1”
【发布时间】:2021-10-12 16:38:21
【问题描述】:

有什么好的食谱可以说:

datetime value
2021-10-05 09:39:00 1
2021-10-05 09:40:00 2
2021-10-05 09:41:00 3
2021-10-05 09:42:00 2 <--
2021-10-05 09:43:00 3

到:

datetime value
2021-10-05 09:39:00 1
2021-10-05 09:40:00 2
2021-10-05 09:41:00 3
2021-10-05 09:42:00 3 <--
2021-10-05 09:43:00 3

在 python/pandas 中?

谢谢。

【问题讨论】:

  • 这能回答你的问题吗? sort_values() method in pandas
  • 你的意思是“单调递增”;不是单片的。
  • @sushanth 这个问题绝对不是这个问题的重复。

标签: python pandas dataframe


【解决方案1】:

通过比较不等于-1 的差异而不单调增加的测试行,然后用移位值替换:

df['value'] = df['value'].where(df['value'].diff().ne(-1), df['value'].shift(-1))
print (df)
   id  value
0   0      1
1   0      2
2   0      3
3   0      3
4   0      3

如果可能多个值不单调增加,最好使用backfill不匹配的值:

df['value'] = df['value'].where(df['value'].diff().ne(-1)).bfill().astype(int)
print (df)
   id  value
0   0      1
1   0      2
2   0      3
3   0      3
4   0      3

【讨论】:

  • @jezrael 我忘了补充的是,我需要它就像一个仪表。所以如果这个系列是这样的'[8,9,9,9,1,1,2]',什么都不应该改变。
  • @Mischbot - 它没有改变,因为从 1 开始?
  • @jezrael - 是的。
  • @Mischbot - df['value'] = df['value'].where(df['value'].diff().ne(-1)).bfill().astype(int) 工作得很好。
【解决方案2】:

我会分两步完成:

  • 通过测试下一个值(shfited 值)是否等于或大于上一个值,将对应的值设置为 NaN。
  • 用之前的值填充 NaN

当然,如果输入中有 NaN,这将不起作用。但在这种情况下,单调递增就没有任何意义了。

In [60]: df = pd.DataFrame({'id': range(5), 'value': [1, 2, 3, 2, 3]}).set_index('id')

In [62]: df.loc[df['value'].shift() >= df['value'], 'value'] = np.nan

In [63]: df
Out[63]:
    value
id
0     1.0
1     2.0
2     3.0
3     NaN
4     3.0

In [64]: df['value'].fillna(method='bfill')
Out[64]:
id
0    1.0
1    2.0
2    3.0
3    3.0
4    3.0
Name: value, dtype: float64

【讨论】:

    【解决方案3】:

    你的意思是:

    df['value'] = df['value'].cummax()
    

    或者:

    df.loc[df['value'] < df['value'].shift(), 'value'] += 1
    

    两个代码都给出:

    >>> df
       id  value
    0   0      1
    1   1      2
    2   2      3
    3   3      3
    4   4      3
    >>> 
    

    【讨论】:

    • 第二个,而不是 +1。问题在标题中。
    • 两个答案都没有测试monolitic increasing
    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多