添加行(如果缺少)以保持所需的顺序

时间:2018-08-28 04:05:29

标签: python pandas

我有一个看起来像这样的数据框:

Hcode |  Hname | ctry | value
  1   |   a    |  X   |  34
  2   |   b    |  X   |  45
  1   |   a    |  Y   |  46
  2   |   b    |  Y   | 123
  3   |   c    |  Y   | 343
  1   |   a    |  Z   | 314
  2   |   b    |  Z   |  12

我希望每个'ctry'具有相同数量的行。也就是说,每个'ctry'都将有Hnameab的{​​{1}}行-不管给定值是否有关联的值行。

我所追求的是这样的:

c

为了使事情稍微复杂一些,我的Hcode | Hname | ctry | value 1 | a | X | 34 2 | b | X | 45 3 | c | X | 1 | a | Y | 46 2 | b | Y | 123 3 | c | Y | 343 1 | a | Z | 314 2 | b | Z | 12 3 | c | Z | 列包含200个值,例如a,b,c,...,200。

我有一个Excel文件,其中包含所有200行的HnameHcode值。

如何使用存储在我的Excel文件中的信息插入这些附加行,这些行将在Hname列中包含空白值?

编辑

@piRSquared的回复对于上述内容非常有用。但是我尝试使用更大的数据集将其概括并添加到代码中,然后遇到以下错误value

我扩展的数据集如下:

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

请注意,Hcode | Hname | Hcateg | ctry | ctry_code | region| region_code| v1 | v2 1 | a | A | X | XX | AFR | 1 | 34 | 5 2 | b | B | X | XX | AFR | 1 | 45 | 12 1 | a | A | Y | YY | EUR | 2 | | 10 2 | b | B | Y | YY | EUR | 2 | 78 | 95 3 | c | C | Y | YY | EUR | 2 | 25 | 29 1 | a | A | Z | ZZ | MAR | 3 | | 59 2 | b | B | Z | zz | MAR | 3 | 98 | 75 始终对应于相同的HcodeHnameHcategctry同样适用。同样,ctry_coderegion也是如此。

我的尝试

region_code

2 个答案:

答案 0 :(得分:2)

创建要与之合并的数据框

cols = ['Hcode', 'Hname', 'ctry']
df2 = pd.DataFrame([
    h + (c,)
    for c in df.ctry.unique()
    for h in pd.factorize([*zip(df.Hcode, df.Hname)])[1]
], columns=cols)

df2.merge(df, 'left')

   Hcode Hname ctry  value
0      1     a    X   34.0
1      2     b    X   45.0
2      3     c    X    NaN
3      1     a    Y   46.0
4      2     b    Y  123.0
5      3     c    Y  343.0
6      1     a    Z  314.0
7      2     b    Z   12.0
8      3     c    Z    NaN

通用

hcols = ['Hcode', 'Hname', 'Hcateg']
ccols = ['ctry', 'ctry_code', 'region', 'region_code']

H = {*zip(*map(df.get, hcols))}
C = {*zip(*map(df.get, ccols))}

d2 = pd.DataFrame(
    [h + c for h in H for c in C],
    columns=hcols + ccols
)

d2.merge(df, 'left')

    Hcode Hname Hcateg ctry ctry_code region  region_code    v1    v2
0       2     b      B    X        XX    AFR            1  45.0  12.0
1       2     b      B    Y        YY    EUR            2  78.0  95.0
2       2     b      B    Z        ZZ    MAR            3   NaN   NaN
3       2     b      B    Z        zz    MAR            3  98.0  75.0
4       1     a      A    X        XX    AFR            1  34.0   5.0
5       1     a      A    Y        YY    EUR            2  10.0   NaN
6       1     a      A    Z        ZZ    MAR            3  59.0   NaN
7       1     a      A    Z        zz    MAR            3   NaN   NaN
8       3     c      C    X        XX    AFR            1   NaN   NaN
9       3     c      C    Y        YY    EUR            2  25.0  29.0
10      3     c      C    Z        ZZ    MAR            3   NaN   NaN
11      3     c      C    Z        zz    MAR            3   NaN   NaN

答案 1 :(得分:0)

要为每个ctry创建一个行,为Hname的每个值,您可以将DataFrame转换为以Hname作为unstack的列,然后重新-堆叠数据,保留空白值:

df.set_index(["ctry", "Hname"])["value"].unstack().stack(dropna=False)