统计DataFrame每行最后一个非零值之后的零的数量
解决方法
原始DataFrame:
| index | jan | feb | marc | april |
|---|---|---|---|---|
| One | 1 | 7 | 0 | 0 |
| two | 0 | 8 | 7 | 0 |
| three | 0 | 0 | 0 | 1 |
需求:统计每行最后一个非零值之后的零的数量,最终结果如下:
| index | num |
|---|---|
| One | 2 |
| two | 1 |
| three | 0 |
方法一:向量化操作(高效)
利用pandas向量化方法处理,避免逐行循环,适合大规模数据集:
import pandas as pd # 构造原始DataFrame data = { 'jan': [1, 0, 0], 'feb': [7, 8, 0], 'marc': [0, 7, 0], 'april': [0, 0, 1] } df = pd.DataFrame(data, index=['One', 'two', 'three']) # 反转列顺序,找到每行第一个非零值对应的原列索引 last_nonzero_col_idx = df.iloc[:, ::-1].ne(0).idxmax(axis=1).apply(df.columns.get_loc) # 计算最后一个非零值之后的零的数量 df['num'] = df.shape[1] - last_nonzero_col_idx - 1 # 提取结果 result = df[['num']] print(result)
方法二:逐行处理(直观)
数据量较小时,用apply逐行遍历逻辑更易懂:
import pandas as pd data = { 'jan': [1, 0, 0], 'feb': [7, 8, 0], 'marc': [0, 7, 0], 'april': [0, 0, 1] } df = pd.DataFrame(data, index=['One', 'two', 'three']) def count_trailing_zeros(row): # 从后往前遍历每行元素 for idx in reversed(range(len(row))): if row.iloc[idx] != 0: # 返回后续零的数量 return len(row) - idx - 1 # 若整行都是零,返回总列数(本案例无此情况) return len(row) df['num'] = df.apply(count_trailing_zeros, axis=1) result = df[['num']] print(result)
两种方法运行后均可得到期望结果。
内容的提问来源于stack exchange,提问作者lakadibo
相关产品推荐
相关产品推荐

