将值与上一行中的值进行比较,然后将值分配给另一列(熊猫)-如何加快速度?

时间:2019-03-24 06:39:10

标签: python pandas

我有一个非常大的数据文件df(超过1000万行和20列)。我正在将一个值与同一列(df['Name'])的上一行中的值进行比较。如果值相同,则第二列(df['Run'])中的值保持不变,否则,该值增加1。

下面是一个输出外观示例。

Name       Run
e679       1
k3333      2
k3333      2
k3333      2
u772       3
u772       3
2000       4
2000       4
2000       4
...        ...

此刻我正在使用以下代码:

run=1
df['Run'].iloc[0]=run

for i in range(1,len(df)):
    if df['Name'].iloc[i] == df['Name'].iloc[i-1]:
         df['Run'].iloc[i] = run
    else:
         run = run+1
         df['Run'].iloc[i] = run

此代码有效,但速度很慢。我想有一种更有效的方法可以做到这一点,有人有经验吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

使用pd.factorize()如下:

print(df)
    Name
0   e679
1  k3333
2  k3333
3  k3333
4   u772
5   u772
6   2000
7   2000
8   2000

df['Run']=pd.factorize(df.Name)[0]+1
#alternative: (~df.duplicated('Name')).cumsum()
print(df)

    Name  Run
0   e679    1
1  k3333    2
2  k3333    2
3  k3333    2
4   u772    3
5   u772    3
6   2000    4
7   2000    4
8   2000    4

注意,NaN将被标记为-1

答案 1 :(得分:1)

这应该有效:

df['Run'] = (df['Name'] != df['Name'].shift()).cumsum()