【问题标题】:Nested ifelse alternative in pandas大熊猫中的嵌套 ifelse 替代品
【发布时间】:2015-11-24 21:44:47
【问题描述】:

假设我们有一个test 数据集:

value   group
123 1
120 1
NA  1
130 1
23  2
22  2
24  2
NA  2

现在我们想用group-wise 中值替换缺失值。在R 中,我们可以使用嵌套的ifelse 调用来实现。

first.med <- median(test[test$group == 1, ]$value, na.rm = T)
second.med <- median(test[test$group == 2, ]$value, na.rm = T)

test$value <- ifelse(is.na(test$value) & test$group == 1, first.med
                     ifelse(is.na(test$value) & test$group == 2, second.med,
                            test$value))

我想应用numpy.where 函数或pandas.DataFrame.Set.map 方法,如here 所示,但这两种技术都不支持嵌套。我可以想到一个列表理解来做到这一点,但我想知道在 NumPy/pandas 领域是否有替代方案。提前谢谢你。

【问题讨论】:

  • 为什么需要嵌套 if-else 语句?例如,在 r 中这通常是不好的做法,您可以简单地执行 with(test, ave(value, group, FUN = function(x) {x[is.na(x)] &lt;- median(x, na.rm = TRUE); x})) 这将适用于 n 个组
  • 您需要了解groupby /"Split-Apply-Combine"。这是一个非常强大的范式。还有更干净的代码。根据@chrisb 的回答
  • @rawr 我只是习惯了ifelse。你的 sn-p 看起来确实好多了。

标签: python r numpy pandas


【解决方案1】:
df = pd.DataFrame({'value' : [123,120,np.nan ,130,23 ,22 ,24 ,np.nan] , 'group' : [1 , 1 ,1 , 1 , 2 , 2 , 2 , 2] })

def replace_with_median(df):
    df['value'][pd.isnull(df['value'])] = df['value'].median()
    return df

df.groupby('group').apply(replace_with_median)

【讨论】:

  • 我看不出这是怎么知道这个组的。
  • df.groupby('group').apply(replace_with_median) 这里按组列分组
【解决方案2】:

在这种情况下,您可以使用groupby 按组中位数填充:

In [16]: df.groupby('group')['value'].apply(lambda x: x.fillna(x.median()))
Out[16]: 
0    123
1    120
2    123
3    130
4     23
5     22
6     24
7     23
dtype: float64

虽然一般来说,这两种方法都可以很好地嵌套。例如,你可以这样做:

In [23]: medians = df.groupby('group')['value'].median()

In [24]: np.where(pd.isnull(df['value']), 
           np.where(df['group'] == 1, medians.loc[1], medians.loc[2]),    
           df['value'])
Out[24]: array([ 123.,  120.,  123.,  130.,   23.,   22.,   24.,   23.])

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2015-10-11
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多