比较 2 个 DF,其中一个是另一个的子集,子集的值发生变化,只需要更新主子集的输入

问题描述 投票:0回答:2

我有一个包含 4 列的主数据框:Wage/Name/Age 和 Output(输出 - 默认值为 0)。这将是 df_main。然后我基于这个创建另一个数据框,但我根据年龄低于 25 岁的人将其过滤掉。这将是 df_subset。然后我想将 df_subset 中的每个工资与一个数字进行比较。比较的输出我想把它插入到 df_subset 的 Output 中,基本上更新它已经有的默认值。然后我只想为来自 df_subset 的人更新 df_main 中的输出列。我没有直接使用 df_main,因为我不想从上面应用过滤器并丢失其他条目。

是否有可能以最佳方式做到这一点?

python dataframe comparison
2个回答
0
投票

您可以使用掩码来形成子集,更改子集并使用相同的掩码将更改写回。有关该方法的一个非常简单的示例,请参见下文。注意 - 您必须处理屏蔽子集的副本。

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)

0
投票

您可以使用:

# 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]
© www.soinside.com 2019 - 2024. All rights reserved.