Python:如何从 pandas DataFrame IN PLACE 中的单元格子选择中减去值?
Python: How to subtract value from subselection of cells in a pandas DataFrame IN PLACE?
我尝试从 pandas DataFrame 中的单元格子选择中减去一个值 (50)。我想从“rt”中减去值,其中 subj == 1 和 cond == std。我想 就地 执行此计算,以便其他值保持不变。
假设我有以下 DataFrame:
data = {'subj': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,],
'rt': [100, 102, 101, 100, 101, 101, 105, 105, 106, 104, 104, 106],
'cond':['nov', 'std', 'std', 'emo', 'std', 'emo', 'nov', 'std', 'std',
'emo', 'std', 'emo']}
df = pd.DataFrame(data)
subj rt cond
0 1 100 nov
1 1 102 std
2 1 101 std
3 1 100 emo
4 1 101 std
5 1 101 emo
6 2 105 nov
7 2 105 std
8 2 106 std
9 2 104 emo
10 2 104 std
11 2 106 emo
现在我想从满足条件 subj == 1 和 cond == std[= 的 'rt' 中减去值 50 36=]。我正在使用以下代码减去该值。
df['rt'] = df[(df['subj'] == 1) & (df['cond'] == 'std')]['rt'].subtract(50)
这就是我期待的:
subj rt cond
0 1 100 nov
1 1 52 std
2 1 51 std
3 1 100 emo
4 1 51 std
5 1 101 emo
6 2 105 nov
7 2 105 std
8 2 106 std
9 2 104 emo
10 2 104 std
11 2 106 emo
相反,这是 我得到的:
subj rt cond
0 1 NaN nov
1 1 2.0 std
2 1 1.0 std
3 1 NaN emo
4 1 1.0 std
5 1 NaN emo
6 2 NaN nov
7 2 NaN std
8 2 NaN std
9 2 NaN emo
10 2 NaN std
11 2 NaN emo
如何保留 rt 列的剩余值而不是 NaN? 我想以相同的方式用其他值减去其他 rt 值而不创建单独的数据帧对于每个条件。
这可以使用 np.where()
来完成
import pandas as pd
import numpy as np
data = {'subj': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,],
'rt': [100, 102, 101, 100, 101, 101, 105, 105, 106, 104, 104, 106],
'cond':['nov', 'std', 'std', 'emo', 'std', 'emo', 'nov', 'std', 'std',
'emo', 'std', 'emo']}
df = pd.DataFrame(data)
df['rt'] = np.where((df['subj'] == 1) & (df['cond'] == 'std'), df['rt'].sub(50), df['rt'])
df
将切片与 loc
结合使用以有效地就地进行(仅计算 3 个匹配值):
df.loc[df['subj'].eq(1)&df['cond'].eq('std'), 'rt'] -= 50
输出:
subj rt cond
0 1 100 nov
1 1 52 std
2 1 51 std
3 1 100 emo
4 1 51 std
5 1 101 emo
6 2 105 nov
7 2 105 std
8 2 106 std
9 2 104 emo
10 2 104 std
11 2 106 emo
我尝试使用 df.loc 如下所示,它起作用了:
df.loc[(df['subj']==1) & (df['cond']=='std'),'rt'] = df['rt'].subtract(50)
我尝试从 pandas DataFrame 中的单元格子选择中减去一个值 (50)。我想从“rt”中减去值,其中 subj == 1 和 cond == std。我想 就地 执行此计算,以便其他值保持不变。
假设我有以下 DataFrame:
data = {'subj': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,],
'rt': [100, 102, 101, 100, 101, 101, 105, 105, 106, 104, 104, 106],
'cond':['nov', 'std', 'std', 'emo', 'std', 'emo', 'nov', 'std', 'std',
'emo', 'std', 'emo']}
df = pd.DataFrame(data)
subj rt cond
0 1 100 nov
1 1 102 std
2 1 101 std
3 1 100 emo
4 1 101 std
5 1 101 emo
6 2 105 nov
7 2 105 std
8 2 106 std
9 2 104 emo
10 2 104 std
11 2 106 emo
现在我想从满足条件 subj == 1 和 cond == std[= 的 'rt' 中减去值 50 36=]。我正在使用以下代码减去该值。
df['rt'] = df[(df['subj'] == 1) & (df['cond'] == 'std')]['rt'].subtract(50)
这就是我期待的:
subj rt cond
0 1 100 nov
1 1 52 std
2 1 51 std
3 1 100 emo
4 1 51 std
5 1 101 emo
6 2 105 nov
7 2 105 std
8 2 106 std
9 2 104 emo
10 2 104 std
11 2 106 emo
相反,这是 我得到的:
subj rt cond
0 1 NaN nov
1 1 2.0 std
2 1 1.0 std
3 1 NaN emo
4 1 1.0 std
5 1 NaN emo
6 2 NaN nov
7 2 NaN std
8 2 NaN std
9 2 NaN emo
10 2 NaN std
11 2 NaN emo
如何保留 rt 列的剩余值而不是 NaN? 我想以相同的方式用其他值减去其他 rt 值而不创建单独的数据帧对于每个条件。
这可以使用 np.where()
import pandas as pd
import numpy as np
data = {'subj': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,],
'rt': [100, 102, 101, 100, 101, 101, 105, 105, 106, 104, 104, 106],
'cond':['nov', 'std', 'std', 'emo', 'std', 'emo', 'nov', 'std', 'std',
'emo', 'std', 'emo']}
df = pd.DataFrame(data)
df['rt'] = np.where((df['subj'] == 1) & (df['cond'] == 'std'), df['rt'].sub(50), df['rt'])
df
将切片与 loc
结合使用以有效地就地进行(仅计算 3 个匹配值):
df.loc[df['subj'].eq(1)&df['cond'].eq('std'), 'rt'] -= 50
输出:
subj rt cond
0 1 100 nov
1 1 52 std
2 1 51 std
3 1 100 emo
4 1 51 std
5 1 101 emo
6 2 105 nov
7 2 105 std
8 2 106 std
9 2 104 emo
10 2 104 std
11 2 106 emo
我尝试使用 df.loc 如下所示,它起作用了:
df.loc[(df['subj']==1) & (df['cond']=='std'),'rt'] = df['rt'].subtract(50)