Python 如何从所有列计算成对矩阵
假设我有数据帧:Python 如何从所有列计算成对矩阵,python,pandas,numpy,matrix,Python,Pandas,Numpy,Matrix,假设我有数据帧: data = [[11, 10, 13], [16, 15, 45], [35, 14,9]] df = pd.DataFrame(data, columns = ['A', 'B', 'C']) df 数据如下所示: A B C 0 11 10 13 1 16 15 45 2 35 14 9 实际数据由100列和1000行组成 我有一个函数,函数的目的是计算有多少值高于另一列的最小值。函数如下所示: def get_count
data = [[11, 10, 13], [16, 15, 45], [35, 14,9]]
df = pd.DataFrame(data, columns = ['A', 'B', 'C'])
df
数据如下所示:
A B C
0 11 10 13
1 16 15 45
2 35 14 9
实际数据由100列和1000行组成
我有一个函数,函数的目的是计算有多少值高于另一列的最小值。函数如下所示:
def get_count_higher_than_min(df, column_name_string, df_col_based):
seriesObj = df.apply(lambda x: True if x[column_name_string] > df_col_based.min(skipna=True) else False, axis=1)
numOfRows = len(seriesObj[seriesObj == True].index)
return numOfRows
get_count_higher_than_min(df, 'A', df['B'])
函数的输出示例如下:
def get_count_higher_than_min(df, column_name_string, df_col_based):
seriesObj = df.apply(lambda x: True if x[column_name_string] > df_col_based.min(skipna=True) else False, axis=1)
numOfRows = len(seriesObj[seriesObj == True].index)
return numOfRows
get_count_higher_than_min(df, 'A', df['B'])
输出为3
。这是因为df['B']
的最小值是10
,来自df['A']
的三个值高于10
,因此输出为3
问题是我想使用该函数计算所有列的成对
我不知道怎样才能有效地解决这个问题。我希望输出的形式类似于混淆矩阵或类似于相关矩阵
示例输出:
A B C
A X 3 X
B X X X
C X X X
来自itertools导入产品的
成对=产品(df.columns,repeat=2)
最小值={}
输出=[]
对于成对的每个_对:
#确保我们只计算一次最小值
最小值=最小值.get(每个值对[1],df[每个值对[1]].min())
最小值[每对[1]]=min_
count=df[df[每对[0]]>min[每对[0]].count()
output.append(计数)
df_所需=pd.DataFrame(
[输出[i:i+len(df.列)],用于范围内的i(0,len(输出),len(df.列))],
columns=df.columns,index=df.columns)
打印(需要df_)
这是O(n2m),其中n是列数,m是行数
minima = df.min()
m = pd.DataFrame({c: (df > minima[c]).sum()
for c in df.columns})
结果:
>>> m
A B C
A 2 3 3
B 2 2 3
C 2 2 2
理论上O(n log(n)m)是可能的。在相等的情况下该怎么办?数据总是整数吗?你能发布完整的输出吗,因为验证答案是否正确很重要