#pyspark
#pyspark
Вопрос:
У меня такая проблема: мне нужно удалить строки, которые имеют в столбце уникальные значения, из фрейма данных
В приведенном ниже примере строки DF1 0 и 3 должны быть удалены
A B C
0 5 100 5
1 1 200 5
2 1 150 4
3 3 500 5
Единственное решение, о котором я думал до сих пор, это:
- groupby(A)
- подсчет строк в каждой группе
- отсеять количество отсчетов > 1
- сохранить результат в DF2
- DF1.пересечение (DF2)
есть еще идеи? решение для RDD также может помочь, но лучше для фрейма данных Спасибо!
Ответ №1:
Более сжатый синтаксис (но следуя тому же подходу):
df=sqlContext.createDataFrame([[5,100,5],[1,200,5],[1,150,4],[3,500,5]],['A','B','C'])
df.registerTempTable('df') # Making SQL queries possible
df_t=sqlContext.sql('select A,count(B) from df group by A having count(B)=1') # step 1 to 4 in 1 statement
df2=df.join(df_t,df.A==df_t.A,'leftsemi') # only keep records that have a matching key
Некоторые люди называют ‘leftsemi’ как ‘left keep’. Он хранит записи фрейма данных 1, если ключ также существует в df_t.