Pandas 新行,它是数据帧中使用Groupby的两行之间的差异

Pandas 新行,它是数据帧中使用Groupby的两行之间的差异,pandas,pandas-groupby,difference-between-rows,Pandas,Pandas Groupby,Difference Between Rows,我有一个数据帧 import pandas as pd df = pd.DataFrame({ 'ID': [1, 1, 1, 2, 2, 2], 'value': [100, 120, 130, 200, 190, 210], 'value2': [2100, 2120, 2130, 2200, 2190, 2210], 'state': ['init','mid', 'final', 'init', 'mid', 'final'], }) 我想添加另一行,这是每个ID的状态列中

我有一个数据帧

import pandas as pd
df = pd.DataFrame({ 
'ID': [1, 1, 1, 2, 2, 2], 
'value': [100, 120, 130, 200, 190, 210],
'value2': [2100, 2120, 2130, 2200, 2190, 2210],   
'state': ['init','mid', 'final', 'init', 'mid', 'final'], 
})
我想添加另一行,这是每个ID的状态列中'final'和'init'的差异

结果应该是这样的

import pandas as pd
df = pd.DataFrame({ 
    'ID': [1, 1, 1, 2, 2, 2, 1, 2], 
    'value': [100, 120, 130, 200, 190, 210, 30, 10],
    'value2': [2100, 2120, 2130, 2200, 2190, 2210, 100, 10],   
     'state': ['init','mid', 'final', 'init', 'mid', 'final', 'diff', 'diff'], 
 })
我试过以下方法。但我得到AttributeError:“函数”对象没有属性“groupby”错误

df1 = df.copy()

df1 = df[df.state.isin(['final', 'init'])].copy
s = df1.groupby('ID', sort=False).diff().dropna.assign(id=df1['ID'].unique(), state='diff')
df = df.append(s, sort=True).sort_values("ID")

像这样的怎么样?按
ID
分组,仅保留
值*
列,取差异,然后重新分配
ID
状态

df
身份证件 价值 价值2 状态 0 1. 100 2100 初始化 1. 1. 120 2120 中间 2. 1. 130 2130 最终的 3. 2. 200 2200 初始化 4. 2. 190 2190 中间 5. 2. 210 2210 最终的
像这样的怎么样?按
ID
分组,仅保留
值*
列,取差异,然后重新分配
ID
状态

df
身份证件 价值 价值2 状态 0 1. 100 2100 初始化 1. 1. 120 2120 中间 2. 1. 130 2130 最终的 3. 2. 200 2200 初始化 4. 2. 190 2190 中间 5. 2. 210 2210 最终的
另一种选择是将
final
状态和
init
之间的差异作为矩阵运算,然后填充缺少的列
ID
state
传递值字典

val_cols = ['value', 'value2']
df_final = df.query('state == "final"')[val_cols].reset_index(drop=True) - df.query('state== "init"')[val_cols].reset_index(drop=True)

df_final = pd.concat([df, df_final])

values = {'ID': {i:i+1 for i, v in enumerate(df.ID.unique())}, 'state': 'diff'}
df_final.fillna(values, inplace=True)
最终结果


另一种选择是将
最终
状态和
初始
之间的差异作为矩阵运算,然后填充缺少的列
ID
状态
,传递值字典

val_cols = ['value', 'value2']
df_final = df.query('state == "final"')[val_cols].reset_index(drop=True) - df.query('state== "init"')[val_cols].reset_index(drop=True)

df_final = pd.concat([df, df_final])

values = {'ID': {i:i+1 for i, v in enumerate(df.ID.unique())}, 'state': 'diff'}
df_final.fillna(values, inplace=True)
最终结果


此解决方案在本例中效果良好。但是,如果ID不是非数字的或不是按顺序排列的,则枚举(df.ID.unique())}中的值={ID':{i:i+1 for i,v,'state':'diff'}不会为ID/group提供正确的输出。如何解决这个问题呢?是@postcolonialist,在这种情况下,在应用操作之前,按id和状态排序
df_final
。此解决方案在本例中运行良好。但是,如果ID不是非数字的或不是按顺序排列的,则枚举(df.ID.unique())}中的值={ID':{i:i+1 for i,v,'state':'diff'}不会为ID/group提供正确的输出。如何解决这个问题呢?是@postcolonialist,在这种情况下,在应用操作之前,按id和状态进行排序应该是可行的