【问题标题】:Create a column which increments value for changes in another row创建一列,为另一行中的更改增加值
【发布时间】:2018-05-09 14:45:01
【问题描述】:

我有一个包含两列的数据框,如下所示:

Var1Var2
a   28
b   28
d   28
f   29
f   29
e   30
b   30
m   30
l   30
u   31
t   31
t   31

我想创建第三列,其值随着另一列的值的每一次变化而增加一。

Var1Var2Var3
a   28  1
b   28  1
d   28  1
f   29  2
f   29  2
e   30  3
b   30  3
m   30  3
l   30  3
u   31  4
t   31  4
t   31  4

我该怎么做呢?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将 Var2 与其 shift-by-1 版本进行比较:

    v
       Var1  Var2
    a     0    28
    b     1    28
    d     2    28
    f     3    30
    f     4    30
    e     5     2
    b     6     2
    m     7     2
    l     8     2
    u     9     5
    t    10     5
    t    11     5
    
    i = v.Var2    
    v['Var3'] = i.ne(i.shift()).cumsum()
    
    v
       Var1  Var2  Var3
    a     0    28     1
    b     1    28     1
    d     2    28     1
    f     3    30     2
    f     4    30     2
    e     5     2     3
    b     6     2     3
    m     7     2     3
    l     8     2     3
    u     9     5     4
    t    10     5     4
    t    11     5     4
    

    【讨论】:

    • 如果 Var2 是字符串呢?
    • @KhalilAlHooti 你的意思是,如果它是一个变量?然后你可以使用 [...] 语法。
    • 我的意思是如果 col Var1 的项目都是字符串。一些随机词,但有些词完全相同。
    • 这个。不过需要更多的支持。
    【解决方案2】:

    使用category

    df.Var2.astype('category').cat.codes.add(1)
    Out[525]: 
    0     1
    1     1
    2     1
    3     2
    4     2
    5     3
    6     3
    7     3
    8     3
    9     4
    10    4
    11    4
    dtype: int8
    

    更新

    from itertools import groupby
    grouped = [list(g) for k, g in groupby(df.Var2.tolist())]
    np.repeat(range(len(grouped)),[len(x) for x in grouped])+1
    

    【讨论】:

    • 很好,但要小心。如果你有 11, 11, 22, 22, 11, 11.... 结果应该是 1, 1, 2, 2, 3, 3 但这会给出 1, 1, 2, 2, 1, 1。
    • @Mohnish 按组长度重复数字。当您打印出分组时,您会看到这是列表列表,然后我们按子列表的长度重复范围值将返回您的组号
    • @Wen 谢谢!很抱歉删除我之前的评论。我自己想通了,但是当我删除我的评论时,我看到你回复了它。非常感谢,非常感谢您的帮助!
    • @Mohnish yw 快乐编码
    • @KhalilAlHooti pd.factorize(df['col'])[0]
    【解决方案3】:

    类似这样的:

    (df.Var2.diff() != 0).cumsum()
    

    【讨论】:

    • 这行得通...谢谢!但是,如果列的值不是连续的,我该如何做呢? (例如:Var2:28,28,28,30,30,2,2,2,2,5,5,5 等)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2014-08-11
    • 2021-11-09
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多