pandas - 计算数据框中所有行与特定行之间的差异
问题描述
这是与此线程类似的问题。
让我们将 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
解决方案
我想这个答案对你来说已经足够了:
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)
推荐阅读
- java - Spigot忽略命令的第一个参数
- shell - 仅基于第 2 列对 csv 文件进行排序。如果第 2 列的 2 行相同,则应仅输入文件顺序。不应基于任何其他列进行排序
- haskell - 理解简单的 Haskell
- python - 如何使用 python 正则表达式将字符串转换为字典
- postgresql - 在 Postgres 中以 ddMMYYYY 格式在日期之间搜索
- c# - 如何在尝试添加到列表之前检查属性是否存在
- python - to_datetime 无法识别熊猫中的日期“2015 年 10 月 20 日”
- django - 为 Django 应用程序进行新迁移,忽略所有其他应用程序模型
- python - 以列表形式返回峰
- laravel - 使用 laravel eloquent create 方法批量插入