使用其他lis中的值在数据帧中添加行

2024-09-28 19:31:46 发布

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

我有一个数据框:

df = pd.DataFrame(rows,columns=['proid','sku', 'qty'])

以及独特的SKU列表

skus = ["SKU1", "SKU2",  "SKU3"]

现在df可能不包含所有组合proidsku的行,其中sku来自uniq list skus

例如:

#    proid  sku   qty
# 1  p1     SKU1   1
# 2  p1     SKU3   2
# 3  p2     SKU1   3

我想以这样一种方式向数据帧添加行,即所有proidsku组合都以默认的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

Tags: columns数据dataframedfrowspdqtyp2
3条回答

您可以使用itertools.productconcat

设置

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

另一个行之有效的答案是:

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()

相关问题 更多 >