Python 使用其他列表中的值在数据框中添加行
我有一个数据框:Python 使用其他列表中的值在数据框中添加行,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框: df = pd.DataFrame(rows,columns=['proid','sku', 'qty']) 以及独特的SKU列表 skus = ["SKU1", "SKU2", "SKU3"] 现在df可能不包含所有组合的行proid和sku,其中sku来自uniq列表sku e、 g: 我希望将行添加到数据框中,使所有proidsku组合都具有默认的0值 结果: # proid sku qty # 1 p1 SKU1 1 # 2 p1
df = pd.DataFrame(rows,columns=['proid','sku', 'qty'])
以及独特的SKU列表
skus = ["SKU1", "SKU2", "SKU3"]
现在df可能不包含所有组合的行proid
和sku
,其中sku
来自uniq列表sku
e、 g:
我希望将行添加到数据框中,使所有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
您可以使用
itertools.product
和concat
设置
然后
海螺
您可以使用
itertools.product
和concat
设置
然后
海螺
另一个行之有效的答案是:
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()
另一个行之有效的答案是:
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()
从所有可能索引的多索引创建数据帧
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()
从所有可能索引的多索引创建数据帧
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()