Skip to main content
 首页 » 编程设计

python之Pandas :转向真/假,删除列

2025年05月04日24del

我正在尝试创建一个我认为很简单的数据透视表,但遇到了严重的问题。有两件事我无法做到:

  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() 

这让我很接近,但是当我试图摆脱“合作伙伴”列时,我什至无法引用它,而且它不是“索引”。

对于第二期,我可以使用:

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

但这似乎非常骇人听闻。任何帮助将不胜感激。

请您参考如下方法:

选项 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