按组删除NaN值

时间:2018-08-24 21:55:18

标签: python pandas

我有一个数据框,其中的“材料”列表示产品代码,“值”列对应产品值,“月”列对应月份。

       Year   Month Materiais  Values
0      2018    M1     52745     NaN
1      2018    M2     52745     NaN
2      2018    M3     52745     NaN
3      2018    M4     52745     NaN
4      2018    M5     52745     NaN
5      2018    M6     52745     NaN
6      2018    M7     52745     NaN
7      2018    M1     58859     NaN
8      2018    M2     58859     NaN
9      2018    M3     58859     NaN
10     2018    M4     58859     NaN
11     2018    M5     58859     300
12     2018    M6     58859     NaN
13     2018    M7     58859     NaN
14     2018    M1     57673     NaN
15     2018    M2     57673     100
16     2018    M3     57673     NaN
17     2018    M4     57673     150

1-)我希望在此数据框中只有一个月内至少具有价值的产品。

所以我的想法是将所有相似的产品代码分组,并检查是否至少有一个值!= NaN

为了分组,我正在使用此功能:

df = df_demand.groupby(['Materiais'], sort=False, as_index=False)
  • 我想知道,如何为仅在所有月份中均具有NaN值的产品创建条件以应用dropna()?

Result 1

2-)使用类似的方法过滤至少有一个值!= NaN'的月份:

df = df_demanda.groupby(['Month'], sort=False, as_index=False)

3 个答案:

答案 0 :(得分:1)

首先,您想要获得一个汇总,该汇总指示给定的产品是否具有非null值(nan的值不是“ true”):

materiais_any_non_null = df.groupby('Materiais')['Values'].transform('any')

然后用这个来掩盖您的df

df[materiais_any_non_null]

结果:

    Year Month  Materiais  Values
7   2018    M1      58859     NaN
8   2018    M2      58859     NaN
9   2018    M3      58859     NaN
10  2018    M4      58859     NaN
11  2018    M5      58859   300.0
12  2018    M6      58859     NaN
13  2018    M7      58859     NaN
14  2018    M1      57673     NaN
15  2018    M2      57673   100.0
16  2018    M3      57673     NaN
17  2018    M4      57673   150.0

答案 1 :(得分:0)

  1. 这将删除Values = NaN的行:

newdf = df.dropna(subset = ['Values'])

  1. 您的代码应该没问题。

答案 2 :(得分:0)

首先创建具有销售的唯一Materiais的列表。

然后只是布尔值索引

sale_months = df[df['Values'].notna()].Materiais.unique()
df[df.Materiais.isin(sale_months)]