[英]How to filter based on group condition
应根据标志列过滤后续 DataFrame。 如果基于列id和cod的组没有任何值与None不同的行,则需要只维护一个唯一行,否则,需要删除列flag中具有None值的行。
import pandas as pd
[['1', 10, 'A'],
['1', 10, 'A'],
['1', 10, None],
['1', 15, 'A'],
['1', 15, None],
['2', 11, 'A'],
['2', 12, 'B'],
['2', 12, 'B'],
['2', 13, None],
['3', 14, None],
['3', 14, None],
['3', 15, None]]
df = pd.DataFrame(data, columns=['id', 'cod','flag'])
如何使用 PySpark 基于上一个 DataFrame 获取下一个 DataFrame?
data = [['1', 10, 'A'],
['1', 15, 'A'],
['2', 11, 'A'],
['2', 12, 'B'],
['2', 13, None],
['3', 14, None],
['3', 15, None]]
df = pd.DataFrame(data, columns=['id', 'cod','flag'])
一种方法是:
df = df.groupBy('id', 'cod').agg(F.max('flag').alias('flag'))
您不能只根据列 id 和 cod 删除重复项,因为不能保证您总是从列标志中获得一个不为空的值。
这可能是一个解决方案
new_df = pd.DataFrame(columns=df.columns)
for index, row in df.iterrows():
if row.values.tolist() not in new_df.values.tolist():
if row["flag"] is None and row.values.tolist()[:2] in new_df[list(new_df.columns)[:2]].values.tolist():
continue
new_df.loc[-1] = row.values.tolist()
new_df.index += 1
最后你可以添加
df = new_df.copy(deep=True)
del new_df
使用PySpark
。 改编自这个答案(Spark)
window = Window.partitionBy(['id', 'cod']).orderBy(col('flag').desc())
out = (df.withColumn('row', row_number().over(window))
.filter(col('row') == 1).drop('row'))
out.show()
# Output
+---+---+----+
| id|cod|flag|
+---+---+----+
| 2| 11| A|
| 2| 12| B|
| 1| 15| A|
| 3| 14|null|
| 2| 13|null|
| 3| 15|null|
| 1| 10| A|
+---+---+----+
设置
from pyspark.sql import SparkSession
from pyspark.sql.window import Window
from pyspark.sql.functions import col, row_number
data = [['1', 10, 'A'],
['1', 10, 'A'],
['1', 10, None],
['1', 15, 'A'],
['1', 15, None],
['2', 11, 'A'],
['2', 12, 'B'],
['2', 12, 'B'],
['2', 13, None],
['3', 14, None],
['3', 14, None],
['3', 15, None]]
columns = ['id', 'cod', 'flag']
spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame(data = data, schema = columns)
df.show()
# Output
+---+---+----+
| id|cod|flag|
+---+---+----+
| 1| 10| A|
| 1| 10| A|
| 1| 10|null|
| 1| 15| A|
| 1| 15|null|
| 2| 11| A|
| 2| 12| B|
| 2| 12| B|
| 2| 13|null|
| 3| 14|null|
| 3| 14|null|
| 3| 15|null|
+---+---+----+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.