我有一个看起来像这样的数据框:
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
的{{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行的Hname
和Hcode
值。
如何使用存储在我的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
始终对应于相同的Hcode
和Hname
。 Hcateg
和ctry
同样适用。同样,ctry_code
和region
也是如此。
我的尝试
region_code
答案 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)