Pandas:转向 True/False,删除列
Pandas: Pivot to True/False, drop column
我正在尝试创建一个我认为很简单的枢轴 table,但我遇到了严重的问题。有两件事我无法做到:
- 删除末尾的 "partner" 列。
- 如果每个公司都有该合作伙伴,则将值设置为 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()
这让我很接近,但是当我试图摆脱 "partner" 列时,我什至无法引用它,而且它不是 "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
另一个选项:
df = df.pivot(values='partner', columns='partner', index='company').reset_index()
至
df = df.pivot(values='partner', columns='partner', index='company').notna()
不过,我更喜欢 lukeA 在评论中的回答:
df.assign(val=True).pivot_table(values='val', index='company', columns='partner', fill_value=False)
对任何非 nan 值使用 return true 的 aggfunc
df = pd.DataFrame({'company':['a','b','c','b'], 'partner':['x','x','y','y'], 'str':['just','some','random','words']})
fp=df.pivot_table(index=['company'],columns=['partner'],aggfunc=any).fillna(False)
print(fp.head())
output
str
partner x y
company
a True False
b True True
c False True
我正在尝试创建一个我认为很简单的枢轴 table,但我遇到了严重的问题。有两件事我无法做到:
- 删除末尾的 "partner" 列。
- 如果每个公司都有该合作伙伴,则将值设置为 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()
这让我很接近,但是当我试图摆脱 "partner" 列时,我什至无法引用它,而且它不是 "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
另一个选项:
df = df.pivot(values='partner', columns='partner', index='company').reset_index()
至
df = df.pivot(values='partner', columns='partner', index='company').notna()
不过,我更喜欢 lukeA 在评论中的回答:
df.assign(val=True).pivot_table(values='val', index='company', columns='partner', fill_value=False)
对任何非 nan 值使用 return true 的 aggfunc
df = pd.DataFrame({'company':['a','b','c','b'], 'partner':['x','x','y','y'], 'str':['just','some','random','words']})
fp=df.pivot_table(index=['company'],columns=['partner'],aggfunc=any).fillna(False)
print(fp.head())
output
str
partner x y
company
a True False
b True True
c False True