2017-09-14 67 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 
相關問題