仅在选定行上添加数据帧

2024-05-28 22:43:45 发布

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

我有一个这样的数据帧

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

Tags: 数据importiddataframepandasdfnewvalue
1条回答
网友
1楼 · 发布于 2024-05-28 22:43:45

可以将^{}与left join一起使用,然后使用^{}

#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

相关问题 更多 >

    热门问题