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

时间:2019-04-16 06:25:59

标签: python pandas

如果我有这样的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

1 个答案:

答案 0 :(得分:5)

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

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.reindexDataFrame.set_indexSeries.unstack来重塑形状:

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

另一种解决方案是通过DataFrame.stack创建新的DataFrame,用indicator=True创建itertools.product,重命名列并通过both进行比较并为{转换为整数从{1}}到True/False的映射:

1/0

最后必要时按DataFrame.merge按两列添加排序:

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