Skip to main content
 首页 » 编程设计

python之使用唯一值基于另一个数据框创建数据框

2025年05月04日20daizhj

如果我有一个像这样的 Pandas 数据框:

colA colB 
 A    A1 
 B    C1 
 A    B1 
 B    A1 

colA 有 2 个唯一值(A、B),colB 有 3 个唯一值(A1、B1 和 C1)。

我想创建一个新的数据框,其中 colA 和 colB 都是组合,另一列 colC 根据早期 df 中存在的组合为 1 或 0。

预期结果:

colA colB colC 
 A    A1   1 
 A    B1   1 
 A    C1   0 
 B    A1   1 
 B    B1   0 
 B    C1   1 

请您参考如下方法:

首先通过 DataFrame.assign 创建新列由1填充,然后创建MultiIndex.from_product通过 Series.unique两列和 DataFrame.set_index 之后的值使用 DataFrame.reindex - 可以通过 fill_value 参数为 colC 列中的新附加行设置值:

mux = pd.MultiIndex.from_product([df['colA'].unique(), 
                                  df['colB'].unique()], names=['colA','colB']) 
df1 = df.assign(colC = 1).set_index(['colA','colB']).reindex(mux, fill_value=0).reset_index() 
print (df1) 
  colA  colB  colC 
0      A  A1     1 
1      A  C1     0 
2      A  B1     1 
3      B  A1     1 
4      B  C1     1 
5      B  B1     0 

另一种方法是使用 DataFrame.set_index reshape 形状, Series.unstack和 DataFrame.stack :

df1 = (df.assign(colC = 1) 
         .set_index(['colA','colB'])['colC'] 
         .unstack(fill_value=0) 
         .stack() 
         .reset_index(name='ColC')) 
 
print (df1) 
  colA colB  ColC 
0    A   A1     1 
1    A   B1     1 
2    A   C1     0 
3    B   A1     1 
4    B   B1     0 
5    B   C1     1 

另一种解决方案是通过 itertools.product 创建新的 DataFrame , DataFrame.merge使用 indicator=True,重命名列并通过 both 比较设置并将 True/False 转换为整数 1/0映射:

from  itertools import product 
df1 = pd.DataFrame(product(df['colA'].unique(), df['colB'].unique()), columns=['colA','colB']) 
df = df1.merge(df, how='left', indicator=True).rename(columns={'_merge':'colC'}) 
df['colC'] = df['colC'].eq('both').astype(int) 
print (df) 
  colA colB  colC 
0    A   A1     1 
1    A   C1     0 
2    A   B1     1 
3    B   A1     1 
4    B   C1     1 
5    B   B1     0 

如有必要,最后添加按 DataFrame.sort_values 对两列进行排序:

df1 = df1.sort_values(['colA','colB'])