【问题标题】:Python: How to select certain columns by slicing for replacing NaN values after groupby?Python:如何通过切片来选择某些列以在 groupby 之后替换 NaN 值?
【发布时间】:2019-07-31 10:26:01
【问题描述】:

假设我们有一个如下的df

df = pd.DataFrame({ 'Col1' : [1, 1, 1, 2, 2, 2, 2],
                   'Col2' : [5, 6, 8, 3, 7, 8, 5],
                  'Col3' : [2, None, None, 3, None, None, 4],
                  'Col4' : [3, None,5, None, 8, None, 66],
                  'Col5': [None, 8, 6, None, 9, 6,None],
                  'Col6' : [3,5,2,5,2,7,9]})

在第一列Col1 应用groupby 后,我想使用jjs in this post here 建议的解决方案替换Col3Col4Col5 列中的None 值。

我的做法是

df = df.groupby('Col1')['Col3','Col4','Col5'].ffill().bfill()

但手动提及列需要做很多工作。

所以,我想知道如何通过切片选择列Col3Col4Col5

谢谢

【问题讨论】:

  • 切片选择是什么意思?
  • 类似于使用.iloc[2:5] 来获取所需的列

标签: python python-3.x pandas dataframe group-by


【解决方案1】:

此解决方案以您想要的方式填充所有 NaN 列:

df.groupby('Col1')[df.columns[df.isnull().any()]].ffill().bfill()

【讨论】:

  • 如果你要在ffillbbill 的所有列中使用NaN,为什么不直接填满所有列呢? df.groupby('Col1').ffill().bfill()
  • 嘿,@Christian。我试过这样做,它正在填充 NaN 列,但它正在删除没有 NaN 值的列,如 Col2 和 Col6
  • 嘿@KashyapMaheshwari。喔好吧。误解了你想要的输出。
  • @RafaelC 我将所需的输出解释为 NaN 列
  • @RafaelC 当然,如果需要所有列,您的解决方案更可取。
【解决方案2】:

Tbh,我不确定我是否理解您的问题。

据我所知,你可以直接做

df.groupby('Col1').ffill().bfill()

因为ffill()bfill() 不会在没有NaNs 的情况下更改您的列。

现在,如果您事先知道需要回填/填充哪些列并希望减少冗长,您可以将它们保存在 cols 变量中

cols = ['Col3','Col4','Col5']
df[cols] = df.groupby('Col1')[cols].ffill().bfill()

【讨论】:

  • 谢谢。我想我对它的实现感到困惑。你建议的方法奏效了。
猜你喜欢
  • 2020-01-04
  • 2018-07-28
  • 1970-01-01
  • 2014-10-30
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 2021-11-24
相关资源
最近更新 更多