2017-09-14 60 views
0

如何将下面的数据框更改为像df2这样的表单?如何有条件地使用Python进行迭代

我有在python一堆为networkx分析原始数据的

的数据帧现在处理成像DF: 每个ID是一个用户ID ABCDE是表示该产品是否是在购买了二进制数据日期(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

您与itertools贴出的尝试是非常接近:

list_product = list(itertools.combinations(d.columns,2)) 
counts = [] 

for a, b in list_product: 
    count = ((d[a] == 1) & (d[b] == 1)).sum()    
    counts.append([a, b, count]) 

counts = pandas.DataFrame(counts, columns=["Target1", "Target2", "Count"]) 

>>> counts 
    Target1 Target2 Count 
0  A  B  1 
1  A  C  2 
2  A  D  0 
3  A  E  2 
4  B  C  1 
5  B  D  1 
6  B  E  5 
7  C  D  1 
8  C  E  3 
9  D  E  1 
相关问题