如何使用python迭代有条件地计数

时间:2017-09-14 06:57:00

标签: python pandas iteration networkx

如何将下面的数据框更改为df2?

等格式

我在python

中有一堆用于networkx分析的原始数据

现在处理数据帧就像df: 每个id是一个用户ID A B C D E是表示产品是否在该日期购买的二进制数据(1:已购买)

df
date        id     A       B      C    D    E  
20170601    1001   1       1      0    0    0
            1002   0       1      0    0    1
            1003   0       1      1    1    1
            1004   0       1      0    0    1
20170602    1001   1       0      1    0    1
            1002   1       0      1    0    1
            1003   0       1      0    0    1
            1004   0       1      0    0    1

我想将数据处理成以下格式

df2  
target1      target2       Weight
  A             B             1     (the time where A & B both = 1)
  A             C             2     (the time where A & C both = 1 )
  A             D             0
  A             E             2
  B             C             1
  B             D             1
  B             E             5
  C             D             1
  C             E             3
  D             E             1

我可以通过计算自己来创建这个数据框,但我有很多超过50的产品,只需要使用它来手动计算它需要花费很多时间:

df[(df.A == 1) & (df.B == 1)].sum()

和itertolls可能有帮助

list_product = list(itertools.combinations(df.columns,2))
dataframe = []

for i, i+1 in range(list_product):
    count = df[(df[i] == 1) & (df[i+1] == 1)].sum()            
    dataframe.append(df.columns[i], df.columns[i+1], count)

这些是否以更快的方式创建此表? (可能有一些迭代方法......)

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您使用itertools发布的尝试非常接近:

export class AppComponent implements AfterViewInit {
  state = 'in';
  ngAfterViewInit() {
    setTimeout(() => {
      this.state = 'out';
    }, 0);
  }
  onEnd(event) {
    this.state = 'in';
    if (event.toState === 'in') {
      setTimeout(() => {
        this.state = 'out';
      }, 0);
    }
  }
}