创建一个计算重复行的重复字段

Create a duplicate fields that counts duplicate rows

我有以下数据框:

    A  B        
0   1  1
1   1  2
2   1  1
3   1  1 
4   2  2

我想创建一个名为“fl_dup”的列,在该行唯一或第一次出现时显示值“0”。相反,当该行被复制并且第二次出现时,它应该显示值“1”。理想情况下,fl_dup 列应如下所示:

    A  B  FL_DUP      
0   1  1  0
1   1  2  0
2   1  1  1
3   1  1  1
4   2  2  0

我尝试使用 this code,但不幸的是有时转换不起作用并且 returns 'null' 值。我也无法获得第一次出现的重复行的“0”值。

  df2 = df.join(
    df.groupBy(df.columns).agg((f.count("*")>1).cast("int").alias("FL_DUP")),
    on=df.columns,
    how="left"
  )

这应该满足您的要求:

import numpy as np
import pandas as pd

df = pd.DataFrame([[1,1],[1,2],[1,1],[1,1],[2,2]], columns=("A", "B"))
df['FL_DUP'] = np.where(df.duplicated(['A', 'B'], keep='first'), 1, 0) 

输出:

   A  B  FL_DUP
0  1  1       0
1  1  2       0
2  1  1       1
3  1  1       1
4  2  2       0

pandas.DataFrame.duplicatednumpy.where 了解更多信息。

下面的方式,因为你没有排序行的列),顺序可能会丢失:

from pyspark.sql import functions as F, Window as W

df = spark.createDataFrame(
    [(1, 1),
     (1, 2),
     (1, 1),
     (1, 1), 
     (2, 2)],
    ['A', 'B']
)

w = W.partitionBy('A', 'B').orderBy('A')
df = df.withColumn('fl_dup', F.when(F.row_number().over(w) == 1, 0).otherwise(1))

df.show()
# +---+---+------+
# |  A|  B|fl_dup|
# +---+---+------+
# |  1|  1|     0|
# |  1|  1|     1|
# |  1|  1|     1|
# |  1|  2|     0|
# |  2|  2|     0|
# +---+---+------+
  1. 创建一个所有值为零的列并将该列添加到数据框中
  2. 将具有重复行的列的值更新为 1
In[0]:
df.insert(2,"fl_dup", list(np.zeros(df.shape[0], dtype = int)), True)
df.loc[df.duplicated(), 'fl_dup'] = '1'
df

输出[1]:

    A   B   fl_dup
0   1   1   0
1   1   2   0
2   1   1   1
3   1   1   1
4   2   2   0