我有一个非常大的数据文件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
此代码有效,但速度很慢。我想有一种更有效的方法可以做到这一点,有人有经验吗?
谢谢!
答案 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()