Python Pandas - Fillna(method = ffill)导致NameError

时间:2015-10-27 18:55:50

标签: python pandas

我创建了一个数据框,然后使用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),但我得到了一个N​​ameError。

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

1 个答案:

答案 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)