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

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上都有一个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   |


为了使事情稍微复杂一些,我的Hname列包含200个值,例如a,b,c,... 200

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

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

编辑:

@piRSquared响应在上述情况下效果很好。但是我尝试使用较大的数据集将其概括并添加到代码中,然后遇到以下错误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


请注意,Hcode始终对应于相同的HnameHcateg。同样适用于ctryctry_code。同样,同样适用于regionregion_code

我的尝试:

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

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

df2.merge(df, 'left')

最佳答案

创建要与之合并的数据框

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

10-07 14:51