我的数据帧如下所示:
+-----+-------+----------+-------+
| No | Group | refGroup | Value |
+-----+-------+----------+-------+
| 123 | A1 | A1 | 5.0 |
| 123 | B1 | A1 | 7.3 |
| 123 | B2 | A1 | 8.9 |
| 123 | B3 | B1 | 7.9 |
| 465 | A1 | A1 | 1.4 |
| 465 | B1 | A1 | 4.5 |
| 465 | B2 | B1 | 7.3 |
+-----+-------+----------+-------+
现在我需要添加另一个列,该列包含当前行中的列Value
的值与具有相同编号(No
)的行中的列Value
的值以及在refGroup
中写入的组(Group
)的值之间的差异
例:如果refGroup
等于Group
,Value
和refValue
是相同的
所以结果应该是:
+-----+-------+----------+-------+----------+
| No | Group | refGroup | Value | refValue |
+-----+-------+----------+-------+----------+
| 123 | A1 | A1 | 5.0 | 5.0 |
| 123 | B1 | A1 | 7.3 | 2.3 |
| 123 | B2 | A1 | 8.9 | 3.9 |
| 123 | B3 | B1 | 7.9 | 0.6 |
| 465 | A1 | A1 | 1.4 | 1.4 |
| 465 | B1 | A1 | 4.5 | 3.1 |
| 465 | B2 | B1 | 7.3 | 2.8 |
+-----+-------+----------+-------+----------+
前两行说明:
第一行:refGroup
等于Group
->refValue
=Value
第二行:搜索No
(123)和refGroup
与Group
(A1)相同的行,并计算当前行的Value
减去引用行的Value
(7.3-5.0=2.3)
我想我可能需要使用groupby()和apply(),但是如何使用呢
希望我的例子足够详细,如果您需要进一步的信息,请询问:)
一种方法是使用类似SQL的数据库技术;将“self join”与
merge
一起使用。使用left_on
和right_on
将“Group”与“refGroup”对齐,然后从每个数据帧记录中减去值,将数据帧合并/加入到自身:输出:
使用理解列表,您可以:
相关问题 更多 >
编程相关推荐