在Pandas中,如何用另一个给定相似索引的数据帧中的值修补缺失值的数据帧?

2024-10-03 21:30:26 发布

您现在位置:Python中文网/ 问答频道 /正文

Fill in missing row values in pandas dataframe

我有下面的数据帧,我想填补缺失的值。在

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        

我希望每个缺失的值都是对应于该mukey的值的平均值。在这种情况下,例如,第一行缺失值将是mukey==425897的sandtool_r和silttotal_r的平均值。熊猫菲尔娜似乎没有做到这一点。有什么帮助吗?在


虽然代码适用于该示例中的示例数据帧,但它在我上载到此处的较大数据集上失败:https://www.dropbox.com/s/w3m0jppnq74op4c/www004.csv?dl=0

^{pr2}$

我得到了一个错误:InvalidIndexError。为什么不起作用?在


Tags: 数据in示例dataframepandasfillrow平均值
2条回答

使用^{}它允许您根据相同的索引用右侧数据帧上的匹配数据修补左数据帧上丢失的数据。在

在这个例子中,df1在左边,df2作为右边的一个。在

In [48]: df = pd.read_csv('www004.csv')
    ...: df1 = df.set_index('mukey')
    ...: df2 = df.groupby('mukey').mean()

In [49]: df1.loc[426178,:]
Out[49]: 
        hzdept_r  hzdepb_r  sandtotal_r  silttotal_r  claytotal_r   om_r
mukey                                                                   
426178         0        36          NaN          NaN          NaN  72.50
426178        36        66          NaN          NaN          NaN  72.50
426178        66       152         42.1         37.9           20   0.25

In [50]: df2.loc[426178,:]
Out[50]: 
hzdept_r       34.000000
hzdepb_r       84.666667
sandtotal_r    42.100000
silttotal_r    37.900000
claytotal_r    20.000000
om_r           48.416667
Name: 426178, dtype: float64

In [51]: df3 = df1.combine_first(df2)
    ...: df3.loc[426178,:]
Out[51]: 
        hzdept_r  hzdepb_r  sandtotal_r  silttotal_r  claytotal_r   om_r
mukey                                                                   
426178         0        36         42.1         37.9           20  72.50
426178        36        66         42.1         37.9           20  72.50
426178        66       152         42.1         37.9           20   0.25

请注意,下面的行在结果df3中仍然没有值

^{pr2}$

因为它们一开始是单行,因此,.mean()对它们来说没有任何意义(呃,看到我在那里做了什么吗?)。在

问题是索引值重复。当您使用df1.fillna(df2)时,如果df1中有多个NaN条目的索引和列标签都是相同的,pandas在尝试分割df1时会感到困惑,并抛出InvalidIndexError。在

您的示例数据帧工作正常,因为即使有重复的索引值,每个索引值中只有一个是空的。在某些情况下,较大的数据帧包含共享索引值和列标签的空项。在

要使其工作,您可以一次只做一列。由于某些原因,当操作一个序列时,pandas不会被同一索引的多个条目混淆,而只会在每个条目中填充相同的值。因此,这应该是有效的:

import pandas as pd
df = pd.read_csv('www004.csv')
# CSV file is here: https://www.dropbox.com/s/w3m0jppnq74op4c/www004.csv?dl=0
df1 = df.set_index('mukey')
grouped = df.groupby('mukey').mean()
for col in ['sandtotal_r', 'silttotal_r']:
    df1[col] = df1[col].fillna(grouped[col])
df1.reset_index()

注意:如果您在填充的数据帧中有“额外”数据,请小心使用combine_first方法。combine_first函数将包含从中填充的数据帧中的所有索引,即使它们不在原始数据帧中。在

相关问题 更多 >