pandas - 如何计算列中更改了多少次
问题描述
我如何以最简单的方式计算,我在特定 DataFrame 列中有多少值变化。例如,我关注了 DF:
a b
0 1
1 1
2 1
3 2
4 1
5 2
6 2
7 3
8 3
9 3
在此数据框中,列中的值b
已更改 4 次(在第 4、5、6 和 8 行中)。
我非常简单的解决方案是:
a = 0
for i in range(df.shape[0] - 1):
if df['b'].iloc[i] != df['b'].iloc[i+1]:
a+=1
解决方案
我认为boolean indexing
需要index
:
idx = df.index[df['b'].diff().shift().fillna(0).ne(0)]
print (idx)
Int64Index([4, 5, 6, 8], dtype='int64')
对于更通用的解决方案,可以通过以下方式进行索引arange
:
a = np.arange(len(df))[df['b'].diff().shift().bfill().ne(0)].tolist()
print (a)
[4, 5, 6, 8]
说明:
首先通过以下方式获得差异Series.diff
:
print (df['b'].diff())
0 NaN
1 0.0
2 0.0
3 1.0
4 -1.0
5 1.0
6 0.0
7 1.0
8 0.0
9 0.0
Name: b, dtype: float64
然后shift
按一个值:
print (df['b'].diff().shift())
0 NaN
1 NaN
2 0.0
3 0.0
4 1.0
5 -1.0
6 1.0
7 0.0
8 1.0
9 0.0
Name: b, dtype: float64
将第一个NaN
s替换为fillna
:
print (df['b'].diff().shift().fillna(0))
0 0.0
1 0.0
2 0.0
3 0.0
4 1.0
5 -1.0
6 1.0
7 0.0
8 1.0
9 0.0
Name: b, dtype: float64
并比较不等于0
print (df['b'].diff().shift().fillna(0).ne(0))
0 False
1 False
2 False
3 False
4 True
5 True
6 True
7 False
8 True
9 False
Name: b, dtype: bool
推荐阅读
- python - 从多行 FASTA 生成的多个 dict 值
- postgresql - Postgres 主键允许冲突
- c# - Entity Framework Core 排除结果
- .net - Petapoco 找不到分割点
- c# - 如果命令未在特定时间内完成,则会发出警报
- javascript - 返回值 background.js 到 content.js
- android - Android构建错误无法计算满足类型:FLOAT和INT
- r - 如果其他两列都等于一,则使数据框的第三列等于一
- java - 将单列 varchar 值回显到没有火花的镶木地板
- laravel - 将多 v-model 放在我在 Laravel 中的双值选择中