2017-06-06 81 views
1

我试图创建我认为是一个简单的数据透视表,但我有严重的问题。有两件事我不能做:熊猫:枢轴为真/假,丢失列

  1. 摆脱最后的“伙伴”列。
  2. 如果每个公司都有该伙伴,则将值设置为True或False。

设置:

df = pd.DataFrame({'company':['a','b','c','b'], 'partner':['x','x','y','y'], 'str':['just','some','random','words']}) 

所需的输出:

company  x  y 
a  True False 
b  True True 
c  False True 

我开始:

df = df.pivot(values = 'partner', columns = 'partner', index = 'company').reset_index() 

这让我接近,但是当我TR要摆脱“合作伙伴”专栏,我甚至不能引用它,而不是“索引”。

对于第二个问题,我可以使用:

df.fillna(False, inplace = True) 
df.loc[~(df['x'] == False), 'x'] = True 
df.loc[~(df['y'] == False), 'y'] = True 

但似乎令人难以置信的哈​​克。任何帮助,将不胜感激。

+1

你想'df.assign(VAL = TRUE).pivot_table(值= 'VAL',索引值”公司',列='伙伴',fill_value =假)'? – lukeA

+0

@lukeA - 是的,这正是我想要的。谢谢! – pshep123

回答

3

选项1

df.groupby(['company', 'partner']).size().unstack(fill_value=0).astype(bool) 


partner  x  y 
company    
a   True False 
b   True True 
c  False True 

得到列摆脱名对象

df.groupby(['company', 'partner']).size().unstack(fill_value=0).astype(bool) \ 
    .rename_axis(None, 1).reset_index() 

    company  x  y 
0  a True False 
1  b True True 
2  c False True 

选项2

pd.crosstab(df.company, df.partner).astype(bool) 

partner  x  y 
company    
a   True False 
b   True True 
c  False True 


pd.crosstab(df.company, df.partner).astype(bool) \ 
    .rename_axis(None, 1).reset_index() 

    company  x  y 
0  a True False 
1  b True True 
2  c False True 

选项3

f1, u1 = pd.factorize(df.company.values) 
f2, u2 = pd.factorize(df.partner.values) 
n, m = u1.size, u2.size 

b = np.bincount(f1 * m + f2) 
pad = np.zeros(n * m - b.size, dtype=int) 
b = np.append(b, pad) 
v = b.reshape(n, m).astype(bool) 

pd.DataFrame(np.column_stack([u1, v]), columns=np.append('company', u2)) 

    company  x  y 
0  a True False 
1  b True True 
2  c False True 

定时
小数据

%timeit df.groupby(['company', 'partner']).size().unstack(fill_value=0).astype(bool).rename_axis(None, 1).reset_index() 
%timeit pd.crosstab(df.company, df.partner).astype(bool).rename_axis(None, 1).reset_index() 

%%timeit 
f1, u1 = pd.factorize(df.company.values) 
f2, u2 = pd.factorize(df.partner.values) 
n, m = u1.size, u2.size 

b = np.bincount(f1 * m + f2) 
pad = np.zeros(n * m - b.size, dtype=int) 
b = np.append(b, pad) 
v = b.reshape(n, m).astype(bool) 

pd.DataFrame(np.column_stack([u1, v]), columns=np.append('company', u2)) 

1000 loops, best of 3: 1.67 ms per loop 
100 loops, best of 3: 5.97 ms per loop 
1000 loops, best of 3: 301 µs per loop 
+0

这非常有帮助 - 但我如何完全摆脱“伙伴”位,并将其压扁到所需的输出顶端? – pshep123

+0

你是男人,一如既往地感谢。出于好奇,选项1和2 - 现在是“合作伙伴”列吗?多指标? – pshep123

+0

@ pshep123它是列对象的名称 – piRSquared