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

标签 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?

最佳答案

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

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

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

关于python - 使用数据帧作为 .fillna() 的参数时,是否需要相同的形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29378852/

相关文章:

python - 如何在x轴线图上显示年份?

python - 在不同的文件中加载 pickle 对象 - 属性错误

python - Beautifulsoup 功能在特定场景下无法正常工作

python - Keras 的 predict_generator 没有返回正确数量的样本

python - 具有移位索引的 Pandas 滚动函数

python - 在 Admin 中提高 Django ForeignKey 字段的性能

pandas - 在 pandas 中使用 from_records 时出现断言错误

python - 使用 pandas 链接数据转换方法的设计模式

python - pandas - 如果排名前 2,则 1

python - 如何使用 ruamel.yaml 正确缩进序列?