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和状态进行排序应该是可行的