Pandas数据框聚合函数计算nan值的数量

3

我有以下数据框

print(A)

   Index  1or0
0      1     0
1      2     0
2      3     0
3      4     1
4      5     1
5      6     1
6      7     1
7      8     0
8      9     1
9     10     1

我有以下代码(Pandas Dataframe count occurrences that only happen immediately),它计算连续出现的值的次数。
ser = A["1or0"].ne(A["1or0"].shift().bfill()).cumsum()

B = (
        A.groupby(ser, as_index=False)
            .agg({"Index": ["first", "last", "count"],
                  "1or0": "unique"})
            .set_axis(["StartNum", "EndNum", "Size", "Value"], axis=1)
            .assign(Value= lambda d: d["Value"].astype(str).str.strip("[]"))
    )

print(B)
​
   StartNum  EndNum  Size Value
0         1       3     3     0
1         4       7     4     1
2         8       8     1     0
3         9      10     2     1

问题是,当出现NaN值时,代码不会将它们放在一个区间中,而总是将它们计算为一个大小的区间,而不是例如3。
print(A2)

   Index  1or0
0      1     0
1      2     0
2      3     0
3      4     1
4      5     1
5      6     1
6      7     1
7      8     0
8      9     1
9     10     1
10    11    NaN
11    12    NaN
12    13    NaN


print(B2)
​
   StartNum  EndNum  Size Value
0         1       3     3     0
1         4       7     4     1
2         8       8     1     0
3         9      10     2     1
4         11     11     1     NaN
5         12     12     1     NaN
6         13     13     1     NaN

但我希望B2是以下内容

print(B2Wanted)
​
   StartNum  EndNum  Size Value
0         1       3     3     0
1         4       7     4     1
2         8       8     1     0
3         9      10     2     1
4         11     13     3     NaN

我需要改变什么,才能使它也适用于NaN?

1个回答

5

在创建分组器之前,首先使用一个不可能的值(这里是-1fillna

group = A['1or0'].fillna(-1).diff().ne(0).cumsum()

# or
# s = A['1or0'].fillna(-1)
# group = s.ne(s.shift()).cumsum()

B = (A.groupby(group, as_index=False)
      .agg(**{'StartNum': ('Index', 'first'),
              'EndNum': ('Index', 'last'),
              'Size': ('1or0', 'size'),
              'Value': ('1or0', 'first')
             })
    )

输出:

   StartNum  EndNum  Size  Value
0         1       3     3    0.0
1         4       7     4    1.0
2         8       8     1    0.0
3         9      10     2    1.0
4        11      13     3    NaN

1
注意:fillna() 是必要的,因为 NaN 无法与任何东西成功比较,甚至是它自己。NaN == 1 的结果是 False,但是 NaN == NaN 也是如此。 - MatBailie
是的,这是正确的,感谢 @MatBailie 的提醒 ;) - mozway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接