两个 DataFrame 列与 group by 的区别

Difference among two DataFrame Columns with group by

我遇到了无法解决的问题:我有两个 DataFrame: df1:带列(ID1、时间戳、值 1) df2:带列(ID2、时间戳、value2、ID1) 在df2中,ID1和ID2是一对多的关系:ID2的某个值只对应ID1的一个值,但ID1的某个值可能与ID2的多个值相关。 我想要做的是向 df1 添加一列,该列是为每个 ID1 计算的,作为每个时间戳上对应于 ID1 的 df.value2 和 value1 (value2 - value1) 的总和之间的差值。 例如,假设我在 df1 中有一行对应于 ID1 = 0,value1 = 5,在 df2 中有两行对应于 ID1 = 0,但 ID2 的值分别等于 'b' 和 'c'with value2 = 4 和 value2 = 3。预期结果应该是:(4+3)-5.

我想到了这个解决方案: df1['calculated'] = df2.groupby(['ID2', pd.Grouper(key='timestamp',freq='H')], as_index=True, group_keys=False)['value2'].sum()-df1.groupby(['ID1', pd.Grouper(key='timestamp',freq='H')], as_index=True, group_keys=False).sum() 问题在于,例如,如果在 df1 中存在 df2.ID1 中不存在的 ID1,则 return 不兼容索引错误。所以基本上只需要为 df2.ID1.

中存在的 ID1 计算差异

有人可以帮我吗? 提前致谢!

编辑:这里有一些可运行示例的代码: 输入:

data_1 = {'ID1':['0', '1'], 'timestamp':[pd.Timestamp('2021-01-01-00:00:00'), pd.Timestamp('2021-01-01-00:00:00')], 'value1':[5, 7]}
data_2 = {'ID2':['3', '4'], 'timestamp':[pd.Timestamp('2021-01-01-00:00:00'), pd.Timestamp('2021-01-01-00:00:00')], 'value2':[4, 3], 'ID1':['0', '0']}

df1 = pd.DataFrame(data=data_1)
df2 = pd.DataFrame(data=data_2)

输出:

ID1  timestamp  value1
0 2021-01-01       5
1 2021-01-01       7
ID2  timestamp  value2 ID1
3 2021-01-01       4   0
4 2021-01-01       3   0

为了便于使用,我只为时间戳使用了一个值,但请记住,如果它不同,则应为每个时间戳计算该值(检查上面问题中的 pd.Grouper) 所以预期的结果应该是这样的一列:

ID1  timestamp  value1  calculated
0 2021-01-01       5        2
1 2021-01-01       7        0

第二行0是因为df2中没有ID1 = '1'

希望我能正确理解你的问题。试试这个解决方案。

#Calculate the sum in df2 for value2
df2_group = df2.groupby(by=["ID1", "timestamp"], as_index=False).agg({"value2":"sum"}).rename(columns={"value2":"df2_sum"})
df2_group

#Merge df1 and df2
df1 = pd.merge(df1, df2_group, on=["ID1", "timestamp"], how="left")

#Calculate value and drop df2_sum columns.
df1["calculated"] = df1["df2_sum"] - df1["value1"]
df1.drop(columns=["df2_sum"], inplace=True)

#Fill value 0 to ID1 not found in ID2 
df1.calculated = df1.calculated.fillna(0)
df1
Out[178]: 
  ID1  timestamp  value1  calculated
0   0 2021-01-01       5         2.0
1   1 2021-01-01       7         0.0