仅在选定的行

时间:2017-10-23 08:18:35

标签: python dataframe

我有一个像这样的数据框

import pandas as pd

df = pd.DataFrame({'id' : [1, 1, 1, 1, 2, 2, 2, 3, 3, 3],\
                   'crit_1' : [0, 0, 1, 0, 0, 0, 1, 0, 0, 1], \
                   'crit_2' : ['a', 'a', 'b', 'b', 'a', 'b', 'a', 'a', 'a', 'a'],\
                   'value' : [3, 4, 3, 5, 1, 2, 4, 6, 2, 3]}, \
                    columns=['id' , 'crit_1', 'crit_2', 'value' ])

df
Out[41]: 
   id  crit_1 crit_2  value
0   1       0      a      3
1   1       0      a      4
2   1       1      b      3
3   1       0      b      5
4   2       0      a      1
5   2       0      b      2
6   2       1      a      4
7   3       0      a      6
8   3       0      a      2
9   3       1      a      3

我根据crit_1

从此框架中拉出一个子集
df_subset = df[(df['crit_1']==1)]

然后我在该子集上执行一个复杂的操作(其性质对于这个问题并不重要),产生一个新列

 df_subset['some_new_val'] = [1, 4,2]

 df_subset
 Out[42]: 
   id  crit_1 crit_2  value  some_new_val
2   1       1      b      3             1
6   2       1      a      4             4
9   3       1      a      3             2

现在,我想将some_new_val添加回原始数据框并添加到列value。但是,我只想将其添加到idcrit_2

匹配的位置

结果应如下所示

   id  crit_1 crit_2  value   new_value
0   1       0      a      3           3
1   1       0      a      4           4
2   1       1      b      3           4
3   1       0      b      5           6
4   2       0      a      1           1
5   2       0      b      2           6
6   2       1      a      4           4
7   3       0      a      6           8
8   3       0      a      2           4
9   3       1      a      3           5

1 个答案:

答案 0 :(得分:2)

您可以在左连接时使用merge,然后使用add

#filter only columns for join and for append
cols = ['id','crit_2', 'some_new_val']
df = pd.merge(df, df_subset[cols], on=['id','crit_2'], how='left')
print (df)
   id  crit_1 crit_2  value  some_new_val
0   1       0      a      3           NaN
1   1       0      a      4           NaN
2   1       1      b      3           1.0
3   1       0      b      5           1.0
4   2       0      a      1           4.0
5   2       0      b      2           NaN
6   2       1      a      4           4.0
7   3       0      a      6           2.0
8   3       0      a      2           2.0
9   3       1      a      3           2.0
df['some_new_val'] = df['some_new_val'].add(df['value'], fill_value=0)
print (df)
   id  crit_1 crit_2  value  some_new_val
0   1       0      a      3           3.0
1   1       0      a      4           4.0
2   1       1      b      3           4.0
3   1       0      b      5           6.0
4   2       0      a      1           5.0
5   2       0      b      2           2.0
6   2       1      a      4           8.0
7   3       0      a      6           8.0
8   3       0      a      2           4.0
9   3       1      a      3           5.0