当前位置: 首页 > 知识库问答 >
问题:

按列值进行减法运算

严远
2023-03-14

我在熊猫数据框上有一个时间序列,它与月份成一行。我打电话给df1。然后我得到组的月平均值,我把df2称为结果数据帧。现在我想减去每个列的月平均值,而不使用循环。也就是说,需要从df1中“月”==1的所有行中减去df2中的行“月==1”。

在numpy中,我将重塑矩阵,执行操作(由于numpy广播),然后再次重塑矩阵。但我不知道什么是泛张力的方法。尽管我觉得这应该是一个非常简单的方法。

这里有一个例子,我用一种超级低效的方式用双for循环来做这件事。

import pandas as pd

df1 = pd.DataFrame({'month': [1, 1, 1, 2, 2, 3, 3, 3, 4, 4],
                   'value': [51, 16, 17, 25, 28, 37, 39, 73, 84, 56],
                    'value2': [551, 165, 175, 255, 258, 375, 359, 735, 854, 556]})


df2 = df1.groupby(["month"]).mean()
df2["month"] = [1,2,3,4]

for mon in range(1, 5):
    for val in ["value", "value2"]:
        mon_mean = float(df2.loc["month"] == mon, [val])
        df1.loc[df1["month"] == mon, [val]] = df1.loc[df1["month"] == mon, [val]].apply(lambda x: x- mon_mean)

任何线索或熊猫功能,你会使用是非常欢迎的。

编辑:

如果不是将df2减去df1,而是第三个数据帧,即比df1多行的df3,您将如何做呢。因此,扩展前面的示例:

import pandas as pd

df1 = pd.DataFrame({'month': [1, 1, 2, 2, 3, 3, 4, 4],
                    'value': [51, 16, 17, 25, 28, 37, 39, 73],
                    'value2': [551, 165, 175, 255, 258, 375, 359, 735, ]})

df3 = pd.DataFrame({'month': [1, 1, 1, 2, 2, 3, 3, 3, 4, 4],
                    'value': [43, 32, 54, 54, 54, 35, 76, 65, 35, 74],
                    'value2': [745, 346, 175, 889, 543, 876, 345, 876, 345, 987]})

df2 = df1.groupby(["month"]).mean()
df2["month"] = [1, 2, 3, 4]

for mon in range(1, 5):
    for val in ["value", "value2"]:
        mon_mean = float(df2[df2["month"] == mon][val])
        print(mon_mean)
        df3.loc[df3["month"] == mon, [val]] = df3.loc[df3["month"] == mon, [val]].apply(lambda x: x - mon_mean)
print(df3)
month  value  value2
0      1    9.5   387.0
1      1   -1.5   -12.0
2      1   20.5  -183.0
3      2   33.0   674.0
4      2   33.0   328.0
5      3    2.5   559.5
6      3   43.5    28.5
7      3   32.5   559.5
8      4  -21.0  -202.0
9      4   18.0   440.0

共有1个答案

亢雅懿
2023-03-14

使用GroupBy。为新的数据帧转换,该数据帧由聚合值填充,因此可以减去数据帧。sub仅列表c中的筛选列:

c = ["value", "value2"]
df1[c] = df1[c].sub(df1.groupby(["month"])[c].transform('mean'))
print (df1)
   month      value      value2
0      1  23.000000  254.000000
1      1 -12.000000 -132.000000
2      1 -11.000000 -122.000000
3      2  -1.500000   -1.500000
4      2   1.500000    1.500000
5      3 -12.666667 -114.666667
6      3 -10.666667 -130.666667
7      3  23.333333  245.333333
8      4  14.000000  149.000000
9      4 -14.000000 -149.000000

详情:

print (df1.groupby(["month"])[c].transform('mean'))
       value      value2
0  28.000000  297.000000
1  28.000000  297.000000
2  28.000000  297.000000
3  26.500000  256.500000
4  26.500000  256.500000
5  49.666667  489.666667
6  49.666667  489.666667
7  49.666667  489.666667
8  70.000000  705.000000
9  70.000000  705.000000

编辑:对于减法在另一个DataFrame是使用转换为索引DataFrame.set_index匹配数据的月份:

c = ["value", "value2"]
df2 =  df1.groupby(["month"])[c].mean()

df3 = df3.set_index('month')[c].sub(df2).reset_index()
print (df3)
   month  value  value2
0      1    9.5   387.0
1      1   -1.5   -12.0
2      1   20.5  -183.0
3      2   33.0   674.0
4      2   33.0   328.0
5      3    2.5   559.5
6      3   43.5    28.5
7      3   32.5   559.5
8      4  -21.0  -202.0
9      4   18.0   440.0
 类似资料:
  • 问题内容: 我有一个结果集如下: 查询是: 我需要得到第二张图表中的结果。基本上,每行中我总有收到的数量,如果有短缺,我需要在最后一行中显示“预期数量”。 预期的: 提前致谢。 编辑,版本02; 问题答案: 问题的一部分是获取预期项目数量的总计。为此,您需要一种将具有相同物料的行彼此区分开的方法,以及用于排放相同物料数量的顺序的规则。 为了尝试解决您的问题,我将假设有一个时间戳列,其值提供放电顺序

  • 问题内容: 我想通过对Sequelize进行简单添加来进行更新。 表: 样品: 此查询后 我知道这是一个简单的问题,但我找不到解决方案。 我可以加减哪个运算符?谢谢 问题答案: 这里是 : 要么 您也可以只替换为。 有关更多详细信息:请 阅读

  • 我有一个pandas数据帧(df),我需要根据列值的计数对其进行排序。列的值是字符串。 例如,目标列的值为橙色、苹果色、香蕉色和桃色。单个计数(df['fruit'].value_counts())为: 香蕉2678 桃2250 橙色1765 苹果1691 结果我需要根据这些计数对初始数据帧(包括所有列等)进行排序。因此,在前2678行中,水果列中的值应为香蕉等

  • 本文向大家介绍R按列值子集行,包括了R按列值子集行的使用技巧和注意事项,需要的朋友参考一下 示例 内置的功能子集可以rows与columns该满足的条件。 为了找到rows有price_Elasticity > 0: df[df$price_Elasticity > 0, ] 基于price_Elasticity > 0和的子集total_Margin > 0: df[df$price_Elast

  • 问题内容: 它有点难以解释。跳到示例可能会更容易。 一个表有一个ID和四列,每列允许为空。 有x行数。(通常小于4)并且在整个列中最多只能使用4个不同的值。 我希望返回最多4行,其中结果集中的每一行基本上都是一列值,其中该值是从顶部保留Col编号开始从右向左选择的。如果另一行的值不是列唯一,则将其移至下一个可用列。 例子: 如果我有: 我想回来 和 给 和 给 谢谢!当存在非唯一列并且值之间存在空

  • 我有一个熊猫DataFrame(df),有很多列,其中两个是“年”和“col_1” 我还有一个列表中总结的提取标准(标准): [1234,5432,...,54353,654,1234]. 如果满足以下条件,我想提取此数据帧的子集: 虽然我可以列出所有这些标准的组合,但我想在一个简短的行中这样做,比如: (来自如何按多列筛选数据帧) 请告诉我怎么做。非常感谢。