我创建了一个数据框,然后使用pivot_table将数据从行转置为列。
In [3]: df = pd.read_csv('Transform.csv')
In [7]: pivot = pd.pivot_table(df, values='Value', index="Structure", columns='Type')
ranges = pivot.filter(items=['Min','Mid','Max'])
print(ranges)
Type Min Mid Max
Structure
AE_BA10 456 543 756
AE_BA12 0 0 0
AE_BA14 0 0 0
AE_BA16 0 0 0
在对值进行更新后,我想将数据从列更改为行,以便将数据堆叠回来。
In [6]: ranges.stack()
Out[6]: Structure Type
AE_BA10 Min 456
Mid 543
Max 756
AE_BA12 Min 0
Mid 0
Max 0
AE_BA14 Min 0
Mid 0
Max 0
AE_BA16 Min 0
Mid 0
Max 0
我试图将数据输入列#34;结构"重复行标签,使其如下所示:
Structure Type
AE_BA10 Min 456
AE_BA10 Mid 543
AE_BA10 Max 756
AE_BA12 Min 0
AE_BA12 Mid 0
AE_BA12 Max 0
AE_BA14 Min 0
AE_BA14 Mid 0
AE_BA14 Max 0
AE_BA16 Min 0
AE_BA16 Mid 0
AE_BA16 Max 0
我尝试使用fillna(method = ffill),但我得到了一个NameError。
In [8]: ranges.fillna(method=ffill)
NameError Traceback (most recent call last) in () ----> 1 ranges.fillna(method=ffill)
NameError: name 'ffill' is not defined
有人可以让我知道我做错了什么吗?
编辑:我把ffill放在引号中,但它仍然没有完全填充结构。In [19]: stacked.fillna(method='ffill')
Out[19]:
Structure Type
AE_BA10 Min 456
Mid 543
Max 756
AE_BA12 Min 0
Mid 0
Max 0
AE_BA14 Min 0
Mid 0
Max 0
AE_BA16 Min 0
Mid 0
Max 0
dtype: float64
最终编辑:Ako的解决方案奏效了。
In [37]: ranges.stack().reset_index(level=0)
Structure 0
Type
Min AE_BA10 456
Mid AE_BA10 543
Max AE_BA10 756
Min AE_BA12 0
Mid AE_BA12 0
Max AE_BA12 0
答案 0 :(得分:1)
NameError是一个很好的指示 - 您需要将ffill
放在引号中 - 您将其作为名称传递,以便python认为它是对对象的引用。
(您可能还想查看用于重构数据的pd.melt()
方法。)
修改1:
除NameError
外,您还会遇到零。尝试取消堆叠数据,因此最大值是列而不是MultiIndex
的一部分,并在该帧上使用ffill
。
我没有您的数据,但有类似的内容:
stacked.stack(level=1).fillna(method='ffill')
应该做的伎俩。
编辑2:
OP真的要求让索引重复所有不是fillna()
问题的行。要做到这一点,这将做:
ranges.stack().reset_index(level=0)