两列可能组合的并集

2024-03-28 16:58:30 发布

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

我的数据框如下所示:

A    B
100  1
100  2
200  2
200  3

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

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)

它很管用,但看起来很难看。有更干净的方法吗?在


Tags: 数据importfalsetruedataframepandasdf原始数据
3条回答

您可以使用:

  • 创建新的填充列Trues
  • ^{}来自所有组合的列
  • df1索引的级别创建^{}
  • ^{}原始df如果不存在值,则添加Falses
  • ^{}表示来自MultiIndex的列

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

使用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

对于库姆斯,你也可以

^{pr2}$

itertoolstuple的帮助下

import itertools

newdf = pd.DataFrame(list(itertools.product(df['A'].unique(),df['B'].unique())),columns = df.columns)

dft = list(df.itertuples(index=False))
newdf['C'] = newdf.apply(lambda x: tuple(x) in dft,axis=1)

输出:

^{pr2}$

相关问题 更多 >