在pandas中,统计数据框中每一列值的变化次数

3
有没有一种简洁的方法在pandas中对数据框中每列值的更改次数进行计数?
我不想自己循环遍历每一列,例如:
import pandas as pd

frame = pd.DataFrame({
    'time':[1234567000,1234567005,1234567009],
    'X1':[96.32,96.01,96.05],
    'X2':[23.88,23.96,23.96]
},columns=['time','X1','X2']) 

print(frame)

changes = []
for column_name in frame.columns.values:
    print('column_name: {0}'.format(column_name))
    changes.append(sum(frame[column_name]!=frame[column_name].shift(1)))

print('changes: {0}'.format(changes))

返回:

         time     X1     X2
0  1234567000  96.32  23.88
1  1234567005  96.01  23.96
2  1234567009  96.05  23.96
column_name: time
column_name: X1
column_name: X2
changes: [3, 3, 2]
1个回答

11

如果这些数值是数字,您可以计算相邻行之间的差异并测试其是否为非零值。接着,对每一列进行求和,以计算数值变化的次数:

In [48]: (frame.diff(axis=0) != 0).sum(axis=0)
Out[48]: 
time    3
X1      3
X2      2
dtype: int64

如果值不一定是数字,那么更通用的方法是将 frame 与其自身下移一行的 shift 结果进行比较 -- 这类似于你发布的代码,只是该操作在整个数据框上执行,而不是逐列执行:

In [50]: (frame != frame.shift(axis=0)).sum(axis=0)
Out[50]: 
time    3
X1      3
X2      2
dtype: int64

数值版本更快,移位版本更健壮。


谢谢!跟进:[在pandas中计算数据框中每列值的变化次数,忽略NaN] (https://dev59.com/NqPia4cB1Zd3GeqPw1V9) - Franck Dernoncourt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接