【问题标题】:Looping through pandas table, changing value by condition on other column循环遍历熊猫表,按条件更改其他列的值
【发布时间】:2019-01-16 15:13:48
【问题描述】:

我目前正在尝试根据另一个列值更改熊猫列的值。到目前为止没问题,但我想遍历两列以设置我的表,如下例所示:

我有一个这样的熊猫表:

id  id2
1    0
1    0
1    0
2    0
2    0
2    0
...

我想得到这样的东西:

id  id2
1    1
1    2
1    3
2    1
2    2
2    3
...

所以我必须以某种方式检查id 列的值,并根据它更改id2 的值。到目前为止,我只有那个:

n=1
m=50
df.loc[df.id==n, 'id2'] = m

这给了我以下输出,但不是我想要做的:

 id  id2
 1   50
 1   50
 1   50
 2   50
 2   50
 2   50

我是编程新手,我尝试的所有循环都失败了。如果有人能解释我该怎么做,我将非常感激!

【问题讨论】:

  • 如果你使用.loc 应该没问题。我不明白输出不符合预期。你是怎么做的?循环n 即范围(10)?您是否更改了m 的值?因为如果您不这样做,那么每次循环时,相应的n 将被更改,但相同的50

标签: python pandas loops iterator


【解决方案1】:

也许DataFrame.rank() 方法是你需要的。

例子:

import pandas as pd
df = pd.DataFrame({'id1':[1,1,1,2,2,2,3,3],'id2':[0,0,0,0,0,0,0,0]})
df['dummy_rank'] = df['id2'].groupby(df['id1']).rank(method='first').apply(int)

关键是“方法”参数,您可以通过文档熊猫了解更多信息。

【讨论】:

    【解决方案2】:

    将 cumsum() 与 groupby() 一起使用

    df = pd.DataFrame({'id':[1,1,1,2,2,2], 'id2':[0,0,0,0,0,0]})
    
    df['id2'] =1
    df['id2'] = df.groupby('id')['id2'].cumsum()
    print(df)
    

    输出:

       id  id2
    0   1    1
    1   1    2
    2   1    3
    3   2    1
    4   2    2
    5   2    3
    

    【讨论】:

    • 非常感谢,这正是我正在寻找的!
    • 有没有办法从 0 开始而不是从 1 开始?
    • @Mauritius 你可以使用add(-1)df['id2'] = df.groupby('id')['id2'].cumsum().add(-1)
    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    相关资源
    最近更新 更多