两列可能组合的联合

时间:2017-08-11 12:21:00

标签: python pandas

我的DataFrame看起来像这样:

A    B
100  1
100  2
200  2
200  3

我需要找到A和B值的所有可能组合,并使用此组合创建新数据框,并使用第三列指示原始df中的每个组合存在:

A   B  C
100 1  True
100 2  True
100 3  False
200 1  False
200 2  True
200 3  True

我现在怎么做:

import pandas as pd

df = pd.DataFrame({'A' : [100,100,200,200], 'B' : [1,2,2,3]})
df['D'] = 42
df2 = df[['A','D']].merge(df[['B','D']], on = 'D')
  [['A','B']].drop_duplicates()
i1 = df.set_index(['A','B']).index
i2 = df2.set_index(['A','B']).index
df2['C'] = i2.isin(i1)
print(df2)

它有效,但看起来很难看。有更清洁的方式吗?

2 个答案:

答案 0 :(得分:3)

您可以使用:

  • 创建新列填充df1 s
  • set_index来自所有组合的列
  • df索引
  • 级别创建MultiIndex.from_product
  • reindex原始False如果不存在,则添加MultiIndex s
  • reset_index来自df['C'] = True df1 = df.set_index(['A','B']) mux = pd.MultiIndex.from_product(df1.index.levels, names=df1.index.names) df = df1.reindex(mux, fill_value=False).reset_index() print (df) A B C 0 100 1 True 1 100 2 True 2 100 3 False 3 200 1 False 4 200 2 True 5 200 3 True
  • 的列
document.querySelector('button.panel__link').addEventListener('click', 
    function(e){
      var el, elContent;
      if(e.target.className === "panel__link panel__link--btb"){
         el = e.target.parentElement.querySelector('h2');
         elContent = el ? (el.textContent || el.innerText) : undefined;
      }

});

答案 1 :(得分:1)

使用cartesian_productpd.merge

In [415]: combs = pd.core.reshape.util.cartesian_product(
                  df.set_index(['A', 'B']).index.levels)

In [416]: combs
Out[416]:
[array([100, 100, 100, 200, 200, 200], dtype=int64),
 array([1, 2, 3, 1, 2, 3], dtype=int64)]

In [417]: (pd.DataFrame({'A': combs[0], 'B': combs[1]})
             .merge(df, how='left', indicator='C')
             .replace({'C': {'both': True, 'left_only': False}}) )
Out[417]:
     A  B      C
0  100  1   True
1  100  2   True
2  100  3  False
3  200  1  False
4  200  2   True
5  200  3   True

对于梳子,你也可以,

In [432]: pd.core.reshape.util.cartesian_product([df.A.unique(), df.B.unique()])
Out[432]:
[array([100, 100, 100, 200, 200, 200], dtype=int64),
 array([1, 2, 3, 1, 2, 3], dtype=int64)]