繁体   English   中英

如何根据组条件进行过滤

[英]How to filter based on group condition

应根据标志列过滤后续 DataFrame。 如果基于列idcod的组没有任何值与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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM