python - 减去数据框中各组之间的值

标签 python pandas

我正在尝试以有效的方式计算可能具有不匹配数据的两组之间的差异。

以下数据框,df ,

df = pd.DataFrame({'type': ['A', 'A', 'A', 'W', 'W', 'W'],
                   'code': ['1', '2', '3', '1', '2', '4'],
                   'values': [50, 25, 25, 50, 10, 40]})

有两种类型的“代码”不匹配 - 特别是“W”类型不存在代码 3,“A”类型不存在代码 4。我将代码包装为字符串,因为在我的特定情况下它们有时是字符串。

我想减去两种类型之间匹配代码的值,以便我们获得,

result = pd.DataFrame({'code': ['1', '2', '3', '4'],
                       'diff': [0, 15, 25, -40]})

其中的符号表示哪种类型具有更大的值。

我在这里花了一些时间检查 groupby diff 方法的变化,但没有看到任何处理两个可能不匹配的列之间相减的特定问题的内容。相反,大多数问题似乎都适合 diff() 方法的预期用途。

我最近尝试的路线是在 df.groupby['type'] 上使用列表理解。分成两个数据帧,但随后我在减去不匹配的情况下仍然遇到类似的问题。

最佳答案

对代码进行分组,然后用 0 替换缺失的值

df = pd.DataFrame({'type': ['A', 'A', 'A', 'W', 'W', 'W'],
                   'code': ['1', '2', '3', '1', '2', '4'],
                   'values': [50, 25, 25, 50, 10, 40]})

def my_func(x):
    # What if there are more than 1 value for a type/code combo?
    a_value = x[x.type == 'A']['values'].max() 
    w_value = x[x.type == 'W']['values'].max()

    a_value = 0 if np.isnan(a_value) else a_value
    w_value = 0 if np.isnan(w_value) else w_value
    return a_value - w_value

df_new = df.groupby('code').apply(my_func)

df_new = df_new.reset_index()
df_new = df_new.rename(columns={0:'diff'})

print(df_new)

  code  diff
0    1     0
1    2    15
2    3    25
3    4   -40

关于python - 减去数据框中各组之间的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55641623/

相关文章:

python - 查找最小值时键入 dict 的提示

python - 如何将 python 脚本作为可执行文件运行并保持对其周围文件的访问?

python - Pandas ,分组并在组中找到最大值,返回值和计数

python - PANDAS - 为多个列正确执行嵌套分组(几列构成唯一标识符)

python - 如何将 Python 1D、2D 或 3D Numpy 数组保存到 MATLAB .mat 中

python - 并行和延迟使用 Dask(和/或 xarray)的短时傅里叶变换(频谱分析)

python - 在 Python 中将一对数字作为参数

一列中的 Pandas 日期差异

Pandas 将多列堆叠成多列

python-3.x - 相当于 pandas.shift() 函数的 numpy 数组?