将成对表转换为二进制制表符

2024-10-06 07:55:31 发布

您现在位置: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次以上的属性,并将值附加到新变量中。你知道吗

或者

2)完全获得最终二进制表的替代方法。我觉得将成对表转换为二进制表可能是数据世界中的常见现象,但我找不到任何代码、模块等可以帮助我这样做。你知道吗

万分感谢!你知道吗


Tags: csv数据答案importdf属性timeas
1条回答
网友
1楼 · 发布于 2024-10-06 07:55:31

我可能会添加一个虚拟列,然后调用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

相关问题 更多 >