当使用数据帧作为.fillna()的参数时,是否需要相同的形状?

时间:2015-03-31 21:24:35

标签: python pandas

根据文档,您可以使用Dataframe作为.fillna()的值参数

http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.fillna.html

但数据框架的形状是否必须相同?如果是这样,为什么第一个例子给我所需的输出?

使用此df:

mukey   hzdept_r    hzdepb_r    sandtotal_r silttotal_r
425897      0         61        
425897      61        152          5.3         44.7
425911      0         30           30.1        54.9
425911      30        74           17.7        49.8
425911      74        84        

我可以跑:

df = pd.read_clipboard()
df1 = df.set_index('mukey')
df1.fillna(df.groupby('mukey').mean(),inplace=True)

和df1产生所需的df:

        hzdept_r  hzdepb_r  sandtotal_r  silttotal_r
mukey                                               
425897         0        61          5.3        44.70
425897        61       152          5.3        44.70
425911         0        30         30.1        54.90
425911        30        74         17.7        49.80
425911        74        84         23.9        52.35

但是,当我尝试在较大的df上运行相同的代码时,它会因InvalidIndexError而中断。

df = pd.read_csv('www004.csv')
df1 = df.set_index('mukey')
df1.fillna(df.groupby('mukey').mean(),inplace=True)

错误:

InvalidIndexError                         Traceback (most recent call last)
<ipython-input-126-a1038ea351c9> in <module>()
----> 1 df1.fillna(df.groupby('mukey').mean(),inplace=True)

/Users/liamfoley/anaconda/lib/python2.7/site-packages/pandas/core/generic.pyc in fillna(self, value, method, axis, inplace, limit, downcast)
   2410                                              downcast=downcast)
   2411             elif isinstance(value, DataFrame) and self.ndim == 2:
-> 2412                 new_data = self.where(self.notnull(), value)
   2413             else:
   2414                 raise ValueError("invalid fill value with a %s" % type(value))

/Users/liamfoley/anaconda/lib/python2.7/site-packages/pandas/core/generic.pyc in where(self, cond, other, inplace, axis, level, try_cast, raise_on_error)
   3306                         not all([other._get_axis(i).equals(ax)
   3307                                  for i, ax in enumerate(self.axes)])):
-> 3308                     raise InvalidIndexError
   3309 
   3310             # slice me out of the other

InvalidIndexError: 

我可以通过创建一个形状相同的means_df来解决这个问题。

import pandas as pd
df = pd.read_csv('www004.csv').set_index('mukey')
means = df.groupby(level=0).mean()
means_df = pd.merge(pd.DataFrame(df.index),means,
                    left_on='mukey',right_index=True,how='left').set_index('mukey')
df1 = df.fillna(means_df)

这给了我想要的结果:

 df.ix[426184]
        hzdept_r  hzdepb_r  sandtotal_r  silttotal_r  claytotal_r  om_r
mukey                                                                  
426184         0        18         30.1         54.9           15   3.5
426184        18        46         58.2         17.8           24   NaN
426184        46       152          NaN          NaN            5   NaN

df1.ix[426184]
        hzdept_r  hzdepb_r  sandtotal_r  silttotal_r  claytotal_r  om_r
mukey                                                                  
426184         0        18        30.10        54.90           15   3.5
426184        18        46        58.20        17.80           24   3.5
426184        46       152        44.15        36.35            5   3.5

相关: Pandas fill missing values in dataframe from another dataframe

Fill in missing row values in pandas dataframe

In Pandas, how can I patch a dataframe with missing values with values from another dataframe given a similar index?

1 个答案:

答案 0 :(得分:2)

解决方法可能是使用transform(而不是聚合)groupby方法:

df1.fillna(df1.groupby(level=0).transform("mean"))

我不清楚这是否是熊猫中的错误,我建议在Github上发布一个问题(这可能是一个不错的功能)!