我有一个看起来像这样的数据框:
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'
在Hname
,a
和b
上都有一个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文件,其中包含
Hcode
和Hname
值的所有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
始终对应于相同的Hname
和Hcateg
。同样适用于ctry
和ctry_code
。同样,同样适用于region
和region_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