我的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)
它有效,但看起来很难看。有更清洁的方式吗?
答案 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_product
和pd.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)]