初学者熊猫问题:
如何为所有列创建交叉频率计数表?我想让输出生成一个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,并认为解决方案是使用交叉表,但是我无法以所需的输出格式得到它(对不起,如果有一些明显的东西我就错过了)。任何帮助表示赞赏!
答案 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|
#+---+---+---+---+---+
哪个与熊猫版本匹配。