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

2024-06-16 12:47:24 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有这样的熊猫数据帧:

colA colB
 A    A1
 B    C1
 A    B1
 B    A1

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

我想创建一个新的数据帧,其中colA和colB都是组合,另一列colC是1或0,基于前面df中的组合。你知道吗

预期结果:

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

Tags: 数据dfa1b1c1colccolbcola
1条回答
网友
1楼 · 发布于 2024-06-16 12:47:24

首先通过^{}1填充创建新列,然后通过两列的^{}值创建^{},在^{}使用^{}之后,可以通过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

另一种方法是使用^{}^{}^{}重塑:

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,使用indicator=True创建^{},重命名列并通过both比较和转换为整数来设置True/False1/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

如有必要,最后添加按^{}按两列排序:

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

相关问题 更多 >