我有一个包含 4 列的主数据框:Wage/Name/Age 和 Output(输出 - 默认值为 0)。这将是 df_main。然后我基于这个创建另一个数据框,但我根据年龄低于 25 岁的人将其过滤掉。这将是 df_subset。然后我想将 df_subset 中的每个工资与一个数字进行比较。比较的输出我想把它插入到 df_subset 的 Output 中,基本上更新它已经有的默认值。然后我只想为来自 df_subset 的人更新 df_main 中的输出列。我没有直接使用 df_main,因为我不想从上面应用过滤器并丢失其他条目。
是否有可能以最佳方式做到这一点?
您可以使用掩码来形成子集,更改子集并使用相同的掩码将更改写回。有关该方法的一个非常简单的示例,请参见下文。注意 - 您必须处理屏蔽子集的副本。
import pandas as pd
df = pd.DataFrame({ 'col1': [1, 2, 1, 2, 1, 2],
'col2': [1.1, 1.3, 3.4, 4.5, 3.2, 2.6]
})
dfx = df[df['col1'] == 2].copy()
dfx['col2'].where(dfx['col2'] < 2.0, 9.9, inplace = True) # change some values
df[df['col1'] == 2] = dfx
print(df)
您可以使用:
# Create a boolean mask
m = df_main['Age'] < 25
df_subset = df_main.loc[m].copy()
# Compare each Wage against a number
number = 3000 # A number for what? Compute difference?
df_subset['Output'] = df_subset['Wage'] - number
# Returns to df_main without overriding existing values
df_main.loc[m, 'Output'] = df_subset['Output']
输出:
>>> df_main
Wage Age Output
0 4658 50 0
1 4758 23 1758
2 4940 29 0
3 4184 37 0
4 4648 48 0
.. ... ... ...
95 1634 63 0
96 3446 23 446
97 2173 53 0
98 1225 44 0
99 3498 25 0
[100 rows x 3 columns]
>>> df_subset
Wage Age Output
1 4758 23 1758
16 2063 21 -937
19 2191 22 -809
30 4552 21 1552
34 1920 23 -1080
42 1389 20 -1611
45 4640 24 1640
64 3065 24 65
76 3966 20 966
81 1033 20 -1967
82 1033 24 -1967
86 4655 22 1655
96 3446 23 446
更直接的方法是:
df_main['Output'] = np.where(df_main['Age'] < 25,
df_main['Wage'] - number, # Age < 25
df_main['Output']) # Other
输入数据帧:
import pandas as pd
import numpy as np
rng = np.random.default_rng(2023)
df_main = pd.DataFrame({'Wage': np.random.randint(1000, 5000, 100),
'Age': np.random.randint(20, 65, 100),
'Output': 0})
print(df_main)
# Output, Name column is not significant here
Wage Age Output
0 2893 34 0
1 1352 21 0
2 1629 23 0
3 1881 49 0
4 2193 34 0
.. ... ... ...
95 4404 31 0
96 2694 50 0
97 4371 33 0
98 3263 34 0
99 2719 45 0
[100 rows x 3 columns]