【问题标题】:pandas strictly increasing column group by熊猫严格增加列组
【发布时间】:2021-03-22 09:07:09
【问题描述】:
dates=['2020-12-01','2020-12-03','2020-12-04', '2020-12-01','2020-12-03','2020-12-04']
symbols=['ABC','ABC','ABC','DEF','DEF','DEF']
v=[1,3,5,7,9,8]

df= pd.DataFrame({'date':dates, 'g':symbols, 'v':v})

         date    g  v
0  2020-12-01  ABC  1
1  2020-12-03  ABC  3
2  2020-12-04  ABC  5
3  2020-12-01  DEF  7
4  2020-12-03  DEF  9
5  2020-12-04  DEF  8

I want to create new dataframe group by 'g' and tell me whether it is strictly increasing or not.
For example, output
    g increasing
0    ABC 1
1    DEF 0
since ABC is always increasing whereas DEF is not.

我想也许我可以使用 diff() 然后选择具有负值的名称。 (这些名字我可以从列表中排除) 但是当我使用这个功能时,我失去了分组列:

df.groupby(by='g')['v'].diff()
0    NaN
1    2.0
2    2.0
3    NaN
4    2.0
5   -1.0

最好的方法是什么?

以下看起来不错,但不是我想要的(因为即使值保持不变,它也会返回 true)

>>> df.groupby(by='g')['v'].is_monotonic_increasing.reset_index()
     g      v
0  ABC   True
1  DEF  False

【问题讨论】:

  • 请修正格式。
  • 另外,按g 分组并检查它是否在增加是什么意思? g 的每个值都有多个值。
  • 我正在尝试找出ABC和DEF对应的列'v'是否一直在增加。

标签: python pandas group-by strict


【解决方案1】:

您只需要检查是否是单调递增的并且所有元素都是唯一的。为此,您可以使用 pandas is_monotonic_increasingunique

res = df.groupby('g', as_index=False)['v'].apply(lambda x: len(x) == len(x.unique()) and x.is_monotonic_increasing)
print(res)

输出

g
ABC     True
DEF    False
Name: v, dtype: bool

也可以使用duplicated 检查所有值是否唯一:

res = df.groupby('g', as_index=False)['v'].apply(lambda x: (~x.duplicated()).all() and x.is_monotonic_increasing)
print(res)

输出

     g      v
0  ABC   True
1  DEF  False

第三种选择是使用 numpy 并验证连续元素之间的所有差异都大于 0:

res = df.groupby('g', as_index=False)['v'].apply(lambda x: np.all(np.diff(x) > 0))

【讨论】:

  • 我不知道为什么,但在两个答案中,我都丢失了“组”信息。
  • 丢失“组”信息是什么意思?
  • 我在 'ABC'、'DEF' 值旁边没有'g' 列
  • @StackOverflow 好吧,我用您提供的示例运行了两个答案,输出就是显示的那个。你用的是什么版本的熊猫?我正在使用 1.1.4
【解决方案2】:

谢谢丹妮的回答。我必须进行一些小改动才能显示“g”列。

df.groupby('g', as_index=True)['v'].apply(lambda x: len(x) == len(x.unique()) and x.is_monotonic_increasing).reset_index()

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 2021-12-12
    • 2022-12-12
    • 1970-01-01
    • 2016-11-09
    • 2018-02-18
    • 2020-06-17
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多