连接名称的值计数

门诺·范·迪克(Menno Van Dijk)

我想转换这个PySpark数据框:

df = spark.createDataFrame([
  ("A", 1),
  ("A", 2), 
  ("A", 3),
  ("B", 1),
  ("B", 2),
  ("B", 4), 
  ("B", 5)
],
  ["name", "connect"]
)

df.show()
+----+-------+
|name|connect|
+----+-------+
|   A|      1|
|   A|      2|
|   A|      3|
|   B|      1|
|   B|      2|
|   B|      4|
|   B|      5|
+----+-------+

转换成以下格式:

df_out = spark.createDataFrame([
  ("A", "A", 3),
  ("B", "B", 4), 
  ("A", "B", 2)
],
  ["name1", "name2", "n_connect"]
)

df_out.show()
+-----+-----+---------+
|name1|name2|n_connect|
+-----+-----+---------+
|    A|    A|        3|
|    B|    B|        4|
|    A|    B|        2|
+-----+-----+---------+

即,我想知道每个名称有多少个“连接”,并且我想知道每个名称之间有多少个共享的“连接”。Spark中是否有任何标准功能可以使我做到这一点?

x

您可以进行自联接,合并相同的组合,即A-> B和B-> A,然后connect为每个组合计算countDistinct 下面我们sort_array(array(d1.name, d2.name))用来对唯一名称组合进行分组:

from pyspark.sql.functions import countDistinct

df_new = df.alias("d1").join(df.alias("d2"), "connect") \
    .selectExpr("sort_array(array(d1.name, d2.name)) as names", "d1.connect") \
    .groupby("names") \
    .agg(countDistinct("connect").alias("n_connect"))
+------+---------+
| names|n_connect|
+------+---------+
|[A, A]|        3|
|[B, B]|        4|
|[A, B]|        2|
+------+---------+

df_new.selectExpr("names[0] as name1", "names[1] as name2", "n_connect").show()
+-----+-----+---------+
|name1|name2|n_connect|
+-----+-----+---------+
|    A|    A|        3|
|    B|    B|        4|
|    A|    B|        2|
+-----+-----+---------+

您可以对熊猫做类似的事情:

pdf = df.toPandas()
pdf.merge(pdf, on="connect") \
    .assign(names=lambda x: [tuple(sorted(z)) for z in zip(x.name_x, x.name_y)]) \
    .groupby('names')["connect"].nunique()
#Out[*]:
#names
#(A, A)    3
#(A, B)    2
#(B, B)    4

根据@anky的建议,使用np.sort()对名称进行排序:

import numpy as np
names = ["name_x", "name_y"]
pdf1 = pdf.merge(pdf, on="connect")
pdf1[names] = np.sort(pdf1[names],1)
pdf1.groupby(names)["connect"].nunique().reset_index()
#  name_x name_y  connect
#0      A      A        3
#1      A      B        2
#2      B      B        4

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MYSQL对计数值求和或对名称值求和

来自分类Dev

MySQL - 添加连接更改计数/总和值?

来自分类Dev

用给定列的值连接列名称

来自分类Dev

在Python列表中查找并返回名称和重复值的计数

来自分类Dev

熊猫打印缺少值的列名称并仅计数

来自分类Dev

MySQL连接并根据其列值进行计数

来自分类Dev

MySQL连接并根据其列值进行计数

来自分类Dev

如果从左连接表中的值不为空,则获取计数

来自分类Dev

将表单元素名称与Coldfusion计数变量连接在一起

来自分类Dev

需要将对象名称与计数器变量正确连接

来自分类Dev

Perl连接具有现有值的数组名称

来自分类Dev

Excel:写列和行名称与特定值连接?

来自分类Dev

将Pandas列名称连接到列值

来自分类Dev

通过PHP连接具有相同名称的输入值

来自分类Dev

如何在Python中打印缺少值的列名称和缺少值的计数?

来自分类Dev

使用pandas对列表的字典中的值进行计数并为输出联接键和值名称

来自分类Dev

获取计数和名称

来自分类Dev

课程名称计数

来自分类Dev

连接的计数结果不同

来自分类Dev

MySQL多连接计数

来自分类Dev

连接的计数结果不同

来自分类Dev

SQL内部连接计数

来自分类Dev

带连接的SQL计数

来自分类Dev

查询连接表的计数

来自分类Dev

使用左连接计数

来自分类Dev

SQL查询返回不需要的值选择计数名称姓氏返回所有记录

来自分类Dev

计算以特定名称开头的 VBA 中唯一值的计数

来自分类Dev

使用正确的连接的mysql计数返回一些错误的值

来自分类Dev

使用正确的连接的mysql计数返回一些错误的值