Python - 根据条件

时间:2018-06-14 14:51:52

标签: python pandas dataframe

我的数据框如下所示:

+-----+-------+----------+-------+
| 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,则GroupValue相同。

所以结果应该是:

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)和NorefGroup(A1)的行,并计算当前行的Group减去{{参考行的1}}(7.3 - 5.0 = 2.3)。

我以为我可能需要使用groupby()和apply(),但是如何?

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

2 个答案:

答案 0 :(得分:3)

一种方法是使用数据库SQL技术;与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

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