Nat*_*aki 3 python dataframe pandas
我有以下数据框
\nprint(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\nRun Code Online (Sandbox Code Playgroud)\n我有以下代码(Pandas Dataframe 计算仅立即发生的出现次数),它计算一个接一个立即发生的值的出现次数。
\nser = 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\nRun Code Online (Sandbox Code Playgroud)\n问题是,当出现 NaN 值时,代码不会将它们放在一个间隔中,而是始终将它们计数为一个大小的间隔,而不是例如 3
\nprint(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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n但我希望 B2 如下
\nprint(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\nRun Code Online (Sandbox Code Playgroud)\n我需要更改什么才能使其也适用于 NaN?
\n在创建石斑鱼之前,首先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)