我有一个数据框:
df = pd.DataFrame(rows,columns=['proid','sku', 'qty'])
和一个独特的skus列表
skus = ["SKU1", "SKU2", "SKU3"]
现在,df可能不包含所有组合proid
和sku
的行,其中sku
来自uniq列表skus
e.g:
# proid sku qty
# 1 p1 SKU1 1
# 2 p1 SKU3 2
# 3 p2 SKU1 3
我想以一种所有proid
sku
组合存在默认值为0的方式向数据框添加行
结果:
# proid sku qty
# 1 p1 SKU1 1
# 2 p1 SKU3 2
# 3 p2 SKU1 3
# 4 p1 SKU2 0
# 5 p2 SKU2 0
# 6 p2 SKU3 0
答案 0 :(得分:3)
您可以使用itertools.product
和concat
z = io.StringIO(""" proid sku qty
1 p1 SKU1 1
2 p1 SKU3 2
3 p2 SKU1 3""")
df = pd.read_table(z, delim_whitespace=True)
p = ["p1", "p2"]
s = ["SKU1", "SKU2", "SKU3"]
df2 = pd.DataFrame(list(it.product(p,s)), columns=["proid", "sku"])
然后
df = df.set_index(["proid", "sku"])
df2 = df2.set_index(["proid", "sku"])
pd.concat([df2[~df2.index.isin(df.index)],df]).reset_index()
proid sku qty
0 p1 SKU2 0
1 p2 SKU2 0
2 p2 SKU3 0
3 p1 SKU1 1
4 p1 SKU3 2
5 p2 SKU1 3
答案 1 :(得分:1)
另一个效果很好的答案:
from itertools import product
combs = pd.DataFrame(list(product(df[proid], df[sku])),
columns=["proid", "sku"])
result = df.merge(combs, how = 'right').fillna(0).drop_duplicates()
答案 2 :(得分:0)
从所有可能索引的多索引创建数据框
ind = pd.MultiIndex.from_product(
[['p1', 'p2'], ['SKU1', 'SKU2' ,'SKU3']]
).to_frame().reset_index(drop=True).rename({0:'proid', 1: 'sku'}, axis=1)
左连接到原始数据框
ind.merge(df, on=['proid', 'sku'], how='left').fillna(0)
输出:
proid sku qty
0 p1 SKU1 1.0
1 p1 SKU2 0.0
2 p1 SKU3 2.0
3 p2 SKU1 3.0
4 p2 SKU2 0.0
5 p2 SKU3 0.0
或者,创建一个多索引&重新索引原始数据帧,用0
填充空值ind2 = pd.MultiIndex.from_product(names=['proid', 'sku'],
iterables=[['p1', 'p2'], ['SKU1', 'SKU2' ,'SKU3']])
df.set_index(['proid', 'sku']).reindex(ind2, fill_value=0).reset_index()