代码之家  ›  专栏  ›  技术社区  ›  Franck Dernoncourt

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

  •  3
  • Franck Dernoncourt  · 技术社区  · 9 年前

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

    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 回复  |  直到 9 年前
        1
  •  10
  •   unutbu    9 年前

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

    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
    

    数字版本更快,移位版本更稳健。