【问题标题】:compare column row wise in dataframe在数据框中逐行比较
【发布时间】:2020-06-11 13:04:13
【问题描述】:

我有一个熊猫数据框 sample dataframe

df =    a1   a2   a3   a4   a5 

         0    1    1     1    0      #dict[a3_a4]  = 1 ,dict[a2_a4]  = 1 ,dict[a2_a3]  = 1
         1    1    1     0    0      #dict[a1_a2]  = 1 , dict[a1_a3]  = 1, dict[a2_a3]  = 1

我需要函数获取数据框作为输入并返回 2 列一起出现的数量并将其存储在字典中 所以我的输出会像

output dict will look like this : {'a1_a2':1,'a2_a3':2, 'a3_a4':1,'a1_a3':1,'a2_a4':1}

如果需要,使用伪代码

PS:我是堆栈溢出的新手,请原谅我的错误。

【问题讨论】:

标签: python pandas dataframe dictionary


【解决方案1】:

您可以使用itertools 组合来获取所有列对。然后你可以multiply 向上取值并取其中的sum

from itertools import combinations

cc = list(combinations(df.columns,2))
df1 = pd.concat([df[c[1]]*df[c[0]] for c in cc], axis=1, keys=cc)
df1.columns = df1.columns.map('_'.join)

d = df1.sum().to_dict()

print(d)

输出:

{'a1_a2': 1,
 'a1_a3': 1,
 'a1_a4': 0,
 'a1_a5': 0,
 'a2_a3': 2,
 'a2_a4': 1,
 'a2_a5': 0,
 'a3_a4': 1,
 'a3_a5': 0,
 'a4_a5': 0}

【讨论】:

  • for a, b in combination(df, 2): dict[ a + b ] = sum([ x == y for x, y in zip(df[a], df[b] )])
  • @Edward 这给出了 a1_a5: 1,我认为这是错误的
  • 是吗?两者的第 0 行都是 0
  • a1_a5 应该为 0,因为在第 0 行和第 1 行中这两个值都不是 (1,1)。从输出字典中,他只希望具有至少一个 (1,1) 的列对返回 1。
  • 我的数据是 2000 行和 20k 列并且只有 35% 的单元格包含值 1 所以如何减少时间@DavideBrex
猜你喜欢
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
相关资源
最近更新 更多