Python 计算数据帧中每列中值的变化

Python 计算数据帧中每列中值的变化,python,pandas,dataframe,Python,Pandas,Dataframe,是否有任何简洁的方法来计算熊猫数据框中每列中值的变化次数 我不想在每一列上循环,例如: 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 =

是否有任何简洁的方法来计算熊猫数据框中每列中值的变化次数

我不想在每一列上循环,例如:

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]

如果值是数值,则可以获取相邻行之间的差异,并测试差异是否为非零。然后对每列求和,以计算值的变化次数:

In [48]: (frame.diff(axis=0) != 0).sum(axis=0)
Out[48]: 
time    3
X1      3
X2      2
dtype: int64
如果这些值不一定是数字,那么更一般的方法是 将
与其自身进行比较
shift
-向下移动一行-这与您发布的代码类似,只是操作是在整个数据帧上执行的,而不是逐列执行:

In [50]: (frame != frame.shift(axis=0)).sum(axis=0)
Out[50]: 
time    3
X1      3
X2      2
dtype: int64
数字版本更快,移位版本更健壮。

谢谢!后续行动: