我的数据框如下所示:
+-----+-------+----------+-------+
| 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
的值与来自具有相同数字的行的Value
列的值之间的差异({{1} })和No
中写的组(Group
)。
执行:如果refGroup
等于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
(123)和No
为refGroup
(A1)的行,并计算当前行的Group
减去{{参考行的1}}(7.3 - 5.0 = 2.3)。
我以为我可能需要使用groupby()和apply(),但是如何?
希望我的例子足够详细,如果您需要任何进一步的信息,请询问:)
答案 0 :(得分:3)
一种方法是使用数据库SQL技术;与merge
一起使用'自我加入'。您使用left_on
和right_on
将数据框合并/加入到自身,以将'Group'与'refGroup'对齐,然后从每个数据框记录中减去该值:
df_out = df.merge(df,
left_on=['No','refGroup'],
right_on=['No','Group'],
suffixes=('','_ref'))
df['refValue'] = np.where(df_out['Group'] == df_out['refGroup'],
df_out['value'],
df_out['value'] - df_out['value_ref'])
df
输出:
No Group refGroup value refValue
0 123 A1 A1 5.0 5.0
1 123 B1 A1 7.3 2.3
2 123 B2 A1 8.9 3.9
3 123 B3 B1 7.9 0.6
4 465 A1 A1 1.4 1.4
5 465 B1 A1 4.5 3.1
6 465 B2 B1 7.3 2.8
答案 1 :(得分:1)
通过理解列表,你可以做到:
df['refValue'] = [ row['Value'] - float(df.loc[(df['No']==row['No']) & (df['Group']==row['refGroup']),'Value'].values) if row['refGroup']!=row['Group'] else row['Value'] for index, row in df.iterrows() ]