繁体   English   中英

Python-根据条件将一列添加到包含来自另一行的值的数据框

[英]Python - Add a column to a dataframe containing a value from another row based on condition

我的数据框如下所示:

+-----+-------+----------+-------+
| 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 |
+-----+-------+----------+-------+

现在我需要添加哪些conatains列的值之间的差额另一列Value从目前的行和列的值Value从该行具有相同数量的( No )和组( Group上所写的) refGroup

示例:如果refGroup等于Group ,则ValuerefValue相同。

因此结果应为:

+-----+-------+----------+-------+----------+
| 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的技术。 merge一起使用'self-join'。 您可以使用left_onright_on将数据left_on合并/ left_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

使用理解列表,您可以执行以下操作:

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() ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM