根据文档,可以使用Dataframe作为.fillna()的值参数
http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.fillna.html
但是数据帧需要相同的形状吗?如果是这样的话,为什么第一个例子给出了期望的输出?在
使用此测向:
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
我可以跑:
^{pr2}$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:
我可以通过创建一个形状相同的mean-tu-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
解决方法是使用transform(而不是聚合)groupby方法:
我不清楚这是否是熊猫的bug,我建议在Github上发布一个问题(这可能是一个不错的特性)!
相关问题 更多 >
编程相关推荐