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

时间:2017-07-22 18:16:27

标签: python dataframe cartesian-product

假设DataFrame的格式为:

SELECT fullname, country
FROM jobseekers
WHERE fullname IN (
    SELECT fullname
    FROM jobseekers
    GROUP BY fullname
    HAVING COUNT(*) > 1
);

如何在 column1 column2 is_duplicate 0 xyz XYZ 1 1 xyz XyZ 1 2 abc ABC 1 3 abc aBc 1 column1上执行笛卡尔积,以便新创建的行的值为0,而原始行在column2列中仍然有1?

输出后的预期DataFrame:

is_duplicate

1 个答案:

答案 0 :(得分: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)

产量

  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