сравнить каждую строку в кадре данных с другими строками и объединить строки, столбцы которых совпадают - PullRequest
0 голосов
/ 27 марта 2019

У меня есть датафрейм, как

  +------+--------------+---------------+-------+---------------+
    |tid   |amount        |person1        |account|person2        |
    +------+--------------+---------------+-------+---------------+
    |t5    |4000.0        |b2             |123    |c3             |
    |t4    |12000.0       |b3             |789    |c2             |
    |t1    |10000.0       |b1             |123    |c1             |
    |t2    |6000.0        |b1             |123    |c1             |
    |t3    |8000.0        |b2             |894    |c2             |
    +------+--------------+---------------+-------+---------------+

Вот некоторые вещи, которые мне нужно сделать.

  1. Сначала мне нужно проверить по тем же номерам счетов и тем же person1's , если они совпадают, мне нужно объединить записи и сложить их сумму

  2. Во-вторых, мне нужно проверить, если какие-либо записи Person1 делят общий счет, как в t3, здесь person1 - b2 разделяет счета 123 и 894. Объедините этот номер счета 894 лица person1 b2 с Step1, только если сумма на b2 превышает 10000.

  3. В-третьих, мне нужно проверить, есть ли совпадающие лица 2, затем мне нужно объединить их в один ряд и суммировать суммы.

Примечание. Учетная запись применима только для чеков person1, а суммы не должны учитываться дважды на уровне person1 и person2.

Итак, мой окончательный результат будет выглядеть

+--------------+--------------+---------------+------------+---------------+
|tid           |amount        |person1        |account     |person2        |
+--------------+--------------+---------------+------------+---------------+
|[t1,t2,t5]    |20000.0       |[b1,b2]        |[123]       |[c1,c3]        |
|[t3,t4]       |20000.0       |[b2,b3]        |[789,894]   |[c2]           |
+--------------+--------------+---------------+------------+---------------+

Я сгруппировал по person1 и количеству в первом сете и group by по person2 во втором сете, но не смог достичь желаемого результата, возможно ли вообще в этих трех уровнях агрегации?

Это то, что я пробовал, но я не получил желаемого результата

    Dataset<Row> condAndBeneDs = txAndBeneDS.join(txAndCondDS,txAndBeneDS.col("txn_id").equalTo(txAndCondDS.col("txn_id"))).
                    drop(txAndCondDS.col("cash_in_amount")).
                    drop(txAndCondDS.col("cash_out_amount")).
                    drop(txAndCondDS.col("txn_date")).
                    drop(txAndCondDS.col("txn_id")).
                    //drop(txAndCondDS.col("account")).
                    drop(txAndBeneDS.col("txn_date")).
                    drop(txAndBeneDS.col("bene_tin")).
                    drop(txAndCondDS.col("cond_tin")).
                    drop(txAndCondDS.col("cash_out_amount")).
                    select(
                            txAndBeneDS.col("txn_id").as("tid"),
                            txAndBeneDS.col("cash_in_amount").as("amount"),
                            txAndBeneDS.col("bene_first_name").as("person1"),
                            txAndCondDS.col("account").as("account"),
                            txAndCondDS.col("cond_first_name").as("person2")
                    );


            condAndBeneDs.show(false);
​
     o/P:
    +---+-------+-------+-------+-------+
    |tid|amount |person1|account|person2|
    +---+-------+-------+-------+-------+
    |t5 |4000.0 |b2     |123    |c3     |
    |t4 |12000.0|b3     |789    |c2     |
    |t1 |10000.0|b1     |123    |c1     |
    |t2 |6000.0 |b1     |123    |c1     |
    |t3 |8000.0 |b2     |894    |c2     |
    +---+-------+-------+-------+-------+
​

​
    Dataset<Row> beneSet = condAndBeneDs.groupBy(condAndBeneDs.col("person1")).agg(

                    functions.collect_list(condAndBeneDs.col("tid")).as("tid"),
                    functions.collect_list(condAndBeneDs.col("account")).as("account"),
                    functions.sum(condAndBeneDs.col("amount")).as("amount"),
                    functions.collect_list(condAndBeneDs.col("person2")).as("person2")

            ).filter(functions.col("amount").$greater$eq("10000"));



            Dataset<Row> condSet  = condAndBeneDs.groupBy(condAndBeneDs.col("person2")).agg(
                    functions.collect_list(condAndBeneDs.col("tid")).as("tid"),
                    functions.collect_list(condAndBeneDs.col("account")).as("account"),
                    functions.sum(condAndBeneDs.col("amount")).as("amount"),
                    functions.collect_list(condAndBeneDs.col("person1")).as("person1")
            ).filter(functions.col("amount").$greater$eq("10000"));


            beneSet.show(false);
    +-------+--------+----------+-------+--------+
    |person1|tid     |account   |amount |person2 |
    +-------+--------+----------+-------+--------+
    |b2     |[t5, t3]|[123, 894]|12000.0|[c3, c2]|
    |b3     |[t4]    |[789]     |12000.0|[c2]    |
    |b1     |[t1, t2]|[123, 123]|16000.0|[c1, c1]|
    +-------+--------+----------+-------+--------+

            condSet.show(false);
    +-------+--------+----------+-------+--------+
    |person2|tid     |account   |amount |person1 |
    +-------+--------+----------+-------+--------+
    |c1     |[t1, t2]|[123, 123]|16000.0|[b1, b1]|
    |c2     |[t4, t3]|[789, 894]|20000.0|[b3, b2]|
    +-------+--------+----------+-------+--------+
​
​

1038 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...