如何统计Pandas DataFrame每行初始NaN与额外列非NaN数量
Pandas DataFrame 统计需求
我有一个包含NaN值的Pandas DataFrame,包含原始列Heading 1、Heading 2、Heading 3,以及额外列Unnamed: 1、Unnamed: 2、Unnamed: 3,示例数据如下:
| Heading 1 | Heading 2 | Heading 3 | Unnamed: 1 | Unnamed: 2 | Unnamed: 3 |
|---|---|---|---|---|---|
| NaN | 34 | 24 | 45 | NaN | NaN |
| NaN | NaN | 24 | 45 | 11 | NaN |
| NaN | NaN | NaN | 45 | 45 | 33 |
| 4 | NaN | 24 | NaN | NaN | NaN |
| NaN | NaN | 4 | NaN | NaN | NaN |
| NaN | 34 | 24 | NaN | NaN | NaN |
| 22 | 34 | 24 | NaN | NaN | NaN |
| NaN | 34 | NaN | 45 | NaN | NaN |
需要遍历每行完成两个统计:
- 原始列中的初始连续NaN值数量(仅计算开头的连续NaN,中间的NaN不计入)
- 额外列中的非NaN值数量
最终以字典形式返回结果,键为行索引,值为包含两个元素的列表:[原始列初始NaN数量, 额外列非NaN数量]。示例结果如下:
{0 : [1, 1], 1 : [2, 2], 2 : [3, 3], 3 : [0, 0], 4 : [2, 0], 5 : [1, 0], 6 : [0, 0], 7 : [1, 1]}
注意:行3和行7的原始列中虽有1个和2个NaN,但仅统计开头的初始NaN,中间的不计入。
更新测试结果
@mozway和@Panda Kim的方案在首个测试DataFrame中均有效,但@mozway的方案在另一测试DataFrame中完全失效。@Panda Kim提供了两种方案(cumsum()和x.first_valid_index()),但在新测试DataFrame中结果略有差异。
新测试DataFrame
| Heading 1 | Heading 2 | Heading 3 | Unnamed: 1 | Unnamed: 2 | Unnamed: 3 | Unnamed: 4 |
|---|---|---|---|---|---|---|
| NaN | 34 | 24 | 45 | NaN | NaN | NaN |
| NaN | NaN | 24 | 45 | 11 | NaN | NaN |
| NaN | NaN | NaN | 45 | 45 | 33 | NaN |
| 4 | NaN | 24 | NaN | NaN | NaN | NaN |
| NaN | NaN | 4 | NaN | NaN | NaN | NaN |
| NaN | 34 | 24 | NaN | NaN | NaN | NaN |
| 22 | 34 | 24 | NaN | NaN | NaN | NaN |
| NaN | 34 | NaN | 45 | NaN | NaN | NaN |
| NaN | NaN | NaN | NaN | 12 | 22 | 45 |
| NaN | NaN | NaN | NaN | NaN | 11 | 69 |
| NaN | NaN | NaN | NaN | 12 | NaN | 45 |
| NaN | NaN | NaN | NaN | NaN | NaN | 45 |
| NaN | NaN | NaN | NaN | NaN | 44 | NaN |
各方案结果对比
@Panda KIM(first_valid_index()方案)
{0: [1, 1], 1: [2, 2], 2: [3, 3], 3: [0, 0], 4: [2, 0], 5: [1, 0], 6: [0, 0], 7: [1, 1], 8: [3, 3], 9: [3, 2], 10: [3, 2], 11: [3, 1], 12: [3, 1]}
@Panda Kim(cumsum()方案)
{0: [1, 1], 1: [2, 2], 2: [3, 3], 3: [0, 0], 4: [2, 0], 5: [1, 0], 6: [0, 0], 7: [1, 1], 8: [4, 3], 9: [5, 2], 10: [4, 2], 11: [6, 1], 12: [5, 1]}
@mozway方案
{0: [1, 1], 1: [2, 2], 2: [3, 3], 3: [0, 0], 4: [2, 0], 5: [1, 0], 6: [0, 0], 7: [1, 1], 8: [3, 0], 9: [3, 0], 10: [3, 0], 11: [3, 0], 12: [3, 0]}
内容的提问来源于stack exchange,提问作者lowkey
相关产品推荐
相关产品推荐

