Pandas Dataframe聚合函数也可以计算nan值

Nat*_*aki 3 python dataframe pandas

我有以下数据框

\n
print(A)\n\n   Index  1or0\n0      1     0\n1      2     0\n2      3     0\n3      4     1\n4      5     1\n5      6     1\n6      7     1\n7      8     0\n8      9     1\n9     10     1\n
Run Code Online (Sandbox Code Playgroud)\n

我有以下代码(Pandas Dataframe 计算仅立即发生的出现次数),它计算一个接一个立即发生的值的出现次数。

\n
ser = A["1or0"].ne(A["1or0"].shift().bfill()).cumsum()\n\nB = (\n        A.groupby(ser, as_index=False)\n            .agg({"Index": ["first", "last", "count"],\n                  "1or0": "unique"})\n            .set_axis(["StartNum", "EndNum", "Size", "Value"], axis=1)\n            .assign(Value= lambda d: d["Value"].astype(str).str.strip("[]"))\n    )\n\nprint(B)\n\xe2\x80\x8b\n   StartNum  EndNum  Size Value\n0         1       3     3     0\n1         4       7     4     1\n2         8       8     1     0\n3         9      10     2     1\n
Run Code Online (Sandbox Code Playgroud)\n

问题是,当出现 NaN 值时,代码不会将它们放在一个间隔中,而是始终将它们计数为一个大小的间隔,而不是例如 3

\n
print(A2)\n\n   Index  1or0\n0      1     0\n1      2     0\n2      3     0\n3      4     1\n4      5     1\n5      6     1\n6      7     1\n7      8     0\n8      9     1\n9     10     1\n10    11    NaN\n11    12    NaN\n12    13    NaN\n
Run Code Online (Sandbox Code Playgroud)\n
\nprint(B2)\n\xe2\x80\x8b\n   StartNum  EndNum  Size Value\n0         1       3     3     0\n1         4       7     4     1\n2         8       8     1     0\n3         9      10     2     1\n4         11     11     1     NaN\n5         12     12     1     NaN\n6         13     13     1     NaN\n
Run Code Online (Sandbox Code Playgroud)\n

但我希望 B2 如下

\n
print(B2Wanted)\n\xe2\x80\x8b\n   StartNum  EndNum  Size Value\n0         1       3     3     0\n1         4       7     4     1\n2         8       8     1     0\n3         9      10     2     1\n4         11     13     3     NaN\n\n
Run Code Online (Sandbox Code Playgroud)\n

我需要更改什么才能使其也适用于 NaN?

\n

moz*_*way 5

在创建石斑鱼之前,首先fillna使用一个值,这是不可能的(此处):-1

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')
             })
    )
Run Code Online (Sandbox Code Playgroud)

输出:

   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
Run Code Online (Sandbox Code Playgroud)