Python根据条件将一列添加到包含另一行值的dataframe中

2024-05-19 01:37:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据帧如下所示:

+-----+-------+----------+-------+
| 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等于GroupValuerefValue是相同的

所以结果应该是:

+-----+-------+----------+-------+----------+
| 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)和refGroupGroup(A1)相同的行,并计算当前行的Value减去引用行的Value(7.3-5.0=2.3)

我想我可能需要使用groupby()和apply(),但是如何使用呢

希望我的例子足够详细,如果您需要进一步的信息,请询问:)


Tags: 数据novaluea1group差异b2编号
2条回答

一种方法是使用类似SQL的数据库技术;将“self join”与merge一起使用。使用left_onright_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() ]

相关问题 更多 >

    热门问题