创建一个计算重复行的重复字段
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.duplicated
和 numpy.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
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
我有以下数据框:
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.duplicated 和 numpy.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
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