在pandas中将长表重塑为值为True/False的宽表的实现方法
Python实现长表转布尔值宽表方案
你用unstack没得到正确结果的核心原因是缺少辅助值列,且没有对unstack后的缺失值做填充,以下是两种可直接运行的实现方式:
方法1:使用crosstab(最简写法)
直接用pandas.crosstab生成计数交叉表后转布尔类型即可:
import pandas as pd from io import StringIO data_from_csv = 'x,y\na,d1\na,d2\nb,d1\nb,d3\n' # 读取原始数据 df = pd.read_csv(StringIO(data_from_csv)) # 转换逻辑 res = pd.crosstab(df['x'], df['y']).astype(bool).reset_index() res = res.rename(columns={'x': 'thing'}) # 输出验证 print(res.to_csv(index=False))
运行后输出和要求的data_to_csv完全一致。
方法2:使用set_index + unstack(符合你原本的思路)
先添加固定为True的辅助列,再做堆叠转换,缺失值填充为False即可:
import pandas as pd from io import StringIO data_from_csv = 'x,y\na,d1\na,d2\nb,d1\nb,d3\n' df = pd.read_csv(StringIO(data_from_csv)) # 转换逻辑 df['value'] = True res = df.set_index(['x', 'y'])['value'].unstack(fill_value=False).reset_index() res = res.rename(columns={'x': 'thing'}) # 输出验证 print(res.to_csv(index=False))
两种方法输出结果完全相同。
内容的提问来源于stack exchange,提问作者baxx
相关产品推荐
相关产品推荐

