DataFrame 列的笛卡尔积并将新创建的行设置为 0 在 Python 中

K. *_* K. 5 python cartesian-product dataframe

假设一个 DataFrame 的形式为:

   column1  column2  is_duplicate
0   xyz      XYZ         1
1   xyz      XyZ         1
2   abc      ABC         1
3   abc      aBc         1
Run Code Online (Sandbox Code Playgroud)

如何执行笛卡尔积column1column2使得新创建的行的值为 0,而原始行的列中仍为 1 is_duplicate

输出后的预期数据帧:

   column1  column2  is_duplicate
0   xyz      XYZ         1
1   xyz      XyZ         1
2   xyz      ABC         0
3   xyz      aBc         0
4   abc      XYZ         0
5   abc      XyZ         0
6   abc      ABC         1
7   abc      aBc         1
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 4

您可以用来pd.MultiIndex.from_product形成笛卡尔积。由于这是一个索引,您可以将其传递给df.reindex扩展 DataFrame 以包含索引中每个值的一行:

import numpy as np 
import pandas as pd

df = pd.DataFrame({'column1': ['xyz', 'xyz', 'abc', 'abc'],
                   'column2': ['XYZ', 'XyZ', 'ABC', 'aBc'],
                   'is_duplicate': [1, 1, 1, 1]})

cols = ['column1', 'column2']
index = pd.MultiIndex.from_product([df[col].unique() for col in cols],
                                   names=cols)
result = df.set_index(['column1','column2']).reindex(index, fill_value=0).reset_index()
print(result)
Run Code Online (Sandbox Code Playgroud)

产量

  column1 column2  is_duplicate
0     xyz     XYZ             1
1     xyz     XyZ             1
2     xyz     ABC             0
3     xyz     aBc             0
4     abc     XYZ             0
5     abc     XyZ             0
6     abc     ABC             1
7     abc     aBc             1
Run Code Online (Sandbox Code Playgroud)