首页 > 解决方案 > 计算数据框中所有行与特定行之间的差异

问题描述

这是与线程类似的问题。

让我们将 df 视为:

df = pd.DataFrame([["a", 2, 3], ["b", 5, 6], ["c", 8, 9],["a", 0, 0], ["a", 8, 7], ["c", 2, 1]], columns = ["A", "B", "C"])

如何计算列“B”的所有行与组中第 N 个索引处的行(每个组的最低索引)之间的差异,并将其放在“D”列中?我想计算我的数据的均方位移,并且我想计算每组中的一列中的值与该组中第一个出现的行的差异。我试过了:

df['D'] = df.groupby(["A"])['B'].sub(df.groupby(['A'])["B"].iloc[0])
Group = df.groupby(["A"])

但是使用 .sub 和 groupby 会引发以下错误: AttributeError: 'SeriesGroupBy' object has no attribute 'sub'

期望的结果是这样的:

   A   B   C   D
0  a   2   3   0  *lowest index in group "a"
1  b   5   6   0  *lowest index in group "b"
2  c   8   9   0  *lowest index in group "c"
3  a   0   0  -2
4  a   8   7   6
5  c   2   1  -6

标签: pandasdataframegroup-byattributeerror

解决方案


我想这个答案对你来说已经足够了:

import pandas as pd

df = pd.DataFrame([["a", 2, 3], ["b", 5, 6], ["c", 8, 9],["a", 0, 0], ["a", 8, 7], ["c", 2, 1]], columns = ["A", "B", "C"])
print("df:")
print(df)
print()

groupA = df.groupby(['A'])
print("groupA:")
print(groupA.groups)
print()

print("lowest indices for each group from columnA:")
lowest_indices = dict()
for k, v in groupA.groups.items():
    lowest_indices[k] = v[0]
print(lowest_indices)
print()

columnB = df['B']
print("columnB:")
print(columnB)
print()

df['D'] = df['B']

for i in range(len(df)):
    group_at_i = df['A'].iloc[i]
    
    lowest_index_of_that = lowest_indices[group_at_i]
    b_element_at_that_index = df['B'].iloc[lowest_index_of_that]
    the_difference = df['B'].iloc[i] - b_element_at_that_index
    df.loc[i, 'D'] = the_difference
    
print("df:")
print(df)

推荐阅读