将配对表转换为二进制表

时间:2015-07-29 19:30:50

标签: python

如果我没有做广泛的研究以试图找到答案,我不会发布这个。唉,我还没有找到任何这样的答案。我有一个配对数据集,看起来像这样:

PERSON, ATTRIBUTE
person1, a
person1, b
person1, c
person1, d
person2, c
person2, d
person2, x
person3, a
person3, b
person3, e
person3, f

我想要做的是:1)删除不超过10次的属性,2)将其转换为二进制表,看起来像这样:

          a     b     c
person1   1     1     1  
person2   0     0     1  
person3   1     1     0

到目前为止,我已经整理了一个脚本来删除只出现10次的属性;然而,由于它必须遍历每个属性,确定其频率并找到相应的x和y值以附加到新变量,因此速度非常缓慢。

import pandas as pd
import numpy as np
import csv
from collections import Counter
import time

df = pd.read_csv(
    filepath_or_buffer='sample.csv',
    sep=',') 

x = df.ix[:, 1].values
y = df.ix[:, 0].values

x_vals = []
y_vals = []

counter = Counter(x)

start_time = time.time()

for each in counter:
    if counter[each]>=10:
        for i, j in enumerate(x):
            if j==each:
                print "Adding position:" + str(i)
                x_vals.append(each)
                y_vals.append(y[i])


print "Time took: %s" %(time.time()-start_time)

我希望得到一些帮助:1)找到一种更快的方法来匹配出现超过10次的属性并将值附加到新变量。

OR

2)完全获得最终二进制表的另一种方法。我觉得将配对表转换为二进制表可能是数据世界中常见的事情,但我无法找到任何有助于这样做的代码,模块等。

万分感谢!

1 个答案:

答案 0 :(得分:0)

我可能会添加一个虚拟列,然后调用pivot_table

>>> df = pd.DataFrame({"PERSON": ["p1", "p2", "p3"] * 10, "ATTRIBUTE": np.random.choice(["a","b","c","d","e","f","x"], 30)})
>>> df.head()
  ATTRIBUTE PERSON
0         d     p1
1         b     p2
2         x     p3
3         b     p1
4         f     p2
>>> df["count"] = 1
>>> p = df.pivot_table(index="PERSON", columns="ATTRIBUTE", values="count", 
                       aggfunc=sum, fill_value=0)
>>> p
ATTRIBUTE  a  b  c  d  e  f  x
PERSON                        
p1         1  3  1  1  1  0  3
p2         2  1  1  2  1  2  1
p3         0  4  1  1  2  0  2

然后我们只能选择超过10次出现的属性(此处为5,来自我的示例):

>>> p.loc[:,p.sum() >= 5]
ATTRIBUTE  b  x
PERSON         
p1         3  3
p2         1  1
p3         4  2