【问题标题】:How to group consecutive column values separated by value (np.nan)?如何对按值分隔的连续列值进行分组(np.nan)?
【发布时间】:2020-10-08 10:35:32
【问题描述】:

我得到以下pandas.DataFrame,其中value 列是输入数据,group 是所需输出。

import pandas as pd
import numpy as np
df = pd.DataFrame({'value': [0.1, 0.2, np.nan, 0.2, 0.3, 0.5, np.nan, 0.1], 
                   'group': [1, 1, np.nan, 2, 2, 2, np.nan, 3]})

我想为每个连续数字段分配一个唯一的 ID,它们由 np.nan 分隔。为此我可能需要一些聚类方法,但我还找不到任何 pandas 函数来实现这一点。

【问题讨论】:

  • 总是只有一个 NaN 行?不是连续 2 次吗?
  • 也可能不止 1 个,甚至连续 100 多个。感谢您指出这一点!

标签: python-3.x pandas numpy dataframe


【解决方案1】:

如果有多个连续的缺失值,另一种想法可行 - 使用 Series.cumsum 创建具有 factorize 的组:

m = df['value'].isna()
df.loc[~m, 'g'] = pd.factorize(m.cumsum()[~m])[0]+ 1
print (df)
   value  group    g
0    0.1    1.0  1.0
1    0.2    1.0  1.0
2    NaN    NaN  NaN
3    0.2    2.0  2.0
4    0.3    2.0  2.0
5    NaN    NaN  NaN
6    NaN    NaN  NaN
7    0.1    3.0  3.0

【讨论】:

    【解决方案2】:

    我们应该删除重复的连续重复 NaN 以便能够创建具有 Series.cumsumSeries.isna 的组

    m = df.isna().any(axis=1).loc[lambda x: ~(x & x.shift(-1))]
    df['group'] = m.cumsum().add(1).mask(m)
    
    # output @jezrael sample
    print(df)
    
       value  group
    0    0.1    1.0
    1    0.2    1.0
    2    NaN    NaN
    3    0.2    2.0
    4    0.3    2.0
    5    NaN    NaN
    6    NaN    NaN
    7    0.1    3.0
    

    【讨论】:

      猜你喜欢
      • 2017-12-02
      • 1970-01-01
      • 2020-03-05
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 2012-09-24
      相关资源
      最近更新 更多