Pandas:所有行无序无替换的组合
Pandas: Combination of all rows without order and without replacement
我想获得 pandas.DataFrame
中所有可能的行组合,但没有替换且没有顺序。
我可以完成第一部分(无需替换):
df = pd.DataFrame({'data': ['a', 'b'], 'actual_key': [1, 2], 'dummy_key': [0, 0]})
df_combs = pd.merge(df, df, on='dummy_key')
df_combs = df_combs[df_combs['actual_key_x'] != df_combs['actual_key_y']]
>> df_combs
>> a 1 0 b 2
>> b 2 0 a 1
但我无法删除多余的行(无顺序)。
看起来你可以避免使用虚拟键并将 DF 交叉连接到自身,过滤掉相同的 x 和 y 值,然后创建一个新键来识别重复项,方法是将两个键都放在 frozenset 中(这是可散列的),然后在该键上删除重复项,例如:
(
df.merge(df, how='cross')
.query('actual_key_x != actual_key_y')
.assign(dupekey=lambda v: v[['actual_key_x', 'actual_key_y']].apply(frozenset, axis=1))
.drop_duplicates(subset=['dupekey'])
.drop(columns=['dupekey'])
)
我想获得 pandas.DataFrame
中所有可能的行组合,但没有替换且没有顺序。
我可以完成第一部分(无需替换):
df = pd.DataFrame({'data': ['a', 'b'], 'actual_key': [1, 2], 'dummy_key': [0, 0]})
df_combs = pd.merge(df, df, on='dummy_key')
df_combs = df_combs[df_combs['actual_key_x'] != df_combs['actual_key_y']]
>> df_combs
>> a 1 0 b 2
>> b 2 0 a 1
但我无法删除多余的行(无顺序)。
看起来你可以避免使用虚拟键并将 DF 交叉连接到自身,过滤掉相同的 x 和 y 值,然后创建一个新键来识别重复项,方法是将两个键都放在 frozenset 中(这是可散列的),然后在该键上删除重复项,例如:
(
df.merge(df, how='cross')
.query('actual_key_x != actual_key_y')
.assign(dupekey=lambda v: v[['actual_key_x', 'actual_key_y']].apply(frozenset, axis=1))
.drop_duplicates(subset=['dupekey'])
.drop(columns=['dupekey'])
)