Python Pandas成对频率表有许多列

时间:2018-02-07 21:19:56

标签: python pandas numpy crosstab

初学者熊猫问题:

如何为所有列创建交叉频率计数表?我想让输出生成一个seaborn热图,显示每对列之间的计数。

我有一个数据框(从带有pyspark的hdfs中拉下来)有~70个唯一列和大约600K行

样本所需的输出:

    C1 C2 C3 C4 ...C70
C1  -  1  1  2
C2  1  -  0  2
C3  1  0  -  1
C4  2  2  1  -
...   
C70

样本DF:

import numpy as np
import pandas as pd
raw_data = {'C1': [ 0, 2, 5, 0, 3], #...600K
    'C2': [3, 0 , 2, 0, 0],
    'C3': [0, 0, 0, 3, 3],
    'C4': [2, 1, 1, 4, 0]} 
df = pd.DataFrame(raw_data, columns = ['C1', 'C2', 'C3','C4'])
print(df)

我尝试过使用pandas中的交叉表,pivot,pivot_table,并认为解决方案是使用交叉表,但是我无法以所需的输出格式得到它(对不起,如果有一些明显的东西我就错过了)。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:3)

使用1将正值剪切到clip_upper,然后计算点积:

i = df.clip_upper(1)
j = i.T.dot(i)

j

    C1  C2  C3  C4
C1   3   1   1   2
C2   1   2   0   2
C3   1   0   2   1
C4   2   2   1   4

答案 1 :(得分:2)

以下是使用spark-sql的PySpark DataFrame解决方案。绝对不如@cᴏʟᴅsᴘᴇᴇᴅ的熊猫解决方案那么优雅,但也许这对于真正的大数据帧非常有用。

假设您的数据位于PySpark DataFrame spark_df中。

spark_df.show()
#+---+---+---+---+
#| C1| C2| C3| C4|
#+---+---+---+---+
#|  0|  3|  0|  2|
#|  2|  0|  0|  1|
#|  5|  2|  0|  1|
#|  0|  0|  3|  4|
#|  3|  0|  3|  0|
#+---+---+---+---+

创建一个空的DataFrame来保存输出。对于StringType(),每个列的IntegerType()列后面都会有一个spark_df列:

cols = spark_df.columns
schema = StructType(
    [StructField('col', StringType())] + [StructField(c, IntegerType()) for c in cols]
)
output = sqlCtx.createDataFrame([], schema=schema)
output.printSchema()
#root
# |-- col: string (nullable = true)
# |-- C1: long (nullable = true)
# |-- C2: long (nullable = true)
# |-- C3: long (nullable = true)
# |-- C4: long (nullable = true)

将此DataFrame注册为表格:

spark_df.registerTempTable('table')

遍历DataFrame中的每一列并构建一个查询以获取该“row”的值。使用output将查询的输出添加到union()

for col in cols:
    q = "SELECT '%s' AS col," % col
    q += ",".join("SUM(CASE WHEN %s > 0 AND %s > 0 THEN 1 ELSE 0 END) AS %s " % (col, c, c) for c in cols)
    q += " FROM table t"
    output = output.union(sqlCtx.sql(q))

最后输出:

output.show()
#+---+---+---+---+---+
#|col| C1| C2| C3| C4|
#+---+---+---+---+---+
#| C1|  3|  1|  1|  2|
#| C2|  1|  2|  0|  2|
#| C3|  1|  0|  2|  1|
#| C4|  2|  2|  1|  4|
#+---+---+---+---+---+

哪个与熊猫版本匹配。