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)完全获得最终二进制表的另一种方法。我觉得将配对表转换为二进制表可能是数据世界中常见的事情,但我无法找到任何有助于这样做的代码,模块等。
万分感谢!
答案 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