我有以下資料框:
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
我嘗試使用此代碼,但不幸的是,有時強制轉換不起作用并回傳“空”值。對于第一次出現的重復行,我也無法獲得“0”值。
df2 = df.join(
df.groupBy(df.columns).agg((f.count("*")>1).cast("int").alias("FL_DUP")),
on=df.columns,
how="left"
)
uj5u.com熱心網友回復:
以下方式,由于您沒有用于排序行的列),因此可能會丟失順序:
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|
# --- --- ------
uj5u.com熱心網友回復:
這應該滿足您的要求:
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。
uj5u.com熱心網友回復:
- 創建一個所有值為零的列并將該列添加到資料框中
- 將具有重復行的列的值更新為 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/472162.html
標籤:Python 阿帕奇火花 pyspark apache-spark-sql 重复
下一篇:離線自動化部署CDH
