我在熊猫数据框上有一个时间序列,它与月份成一行。我打电话给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
使用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]. 如果满足以下条件,我想提取此数据帧的子集: 虽然我可以列出所有这些标准的组合,但我想在一个简短的行中这样做,比如: (来自如何按多列筛选数据帧) 请告诉我怎么做。非常感谢。