我有一个虚构的数据框来复制我试图在 python 中解决的实际问题,以将大型机系统上保存的帐户费率与费率表中应设置的内容进行协调。
我有 3 个表,但在本示例中它们已合并到一个数据帧中。
- 带有利率条件的账户信息(df 的前 5 列)。这些费率是应用于帐户的实际费率,需要进行匹配以确保它们设置正确
- 非标准费率 - 一旦满足特定条件,某些账户将应用这些非标准费率
- 标准费率 - 与上述相同,一旦满足某些条件,这些费率将适用
import pandas as pd
import numpy as np
df = pd.DataFrame([[1234567890,3.5,'GG','N','N','Y',np.NaN,np.NaN,'N','N',3.5,'GG'],
[7854567890,np.NaN,'GG','N','N','N',np.NaN,'GG','N','N',3.5,'GG'],
[9876542190,3.5,'FF','N','N','Y',np.NaN,np.NaN,'N','Y',3.5,'FI'],
[9632587415,3.5,'GG','N','N','N',3,'GG','N','N',3.5,'GG']],
columns = ['Account','Account_Spread','Account_Swing','indict_1','indict_2','Negotiated_Rate',
'Non_std_Spread','Non_std_Code','Non_std_indict_1','Non_std_indict_2','Std_Spread','Std_Swing'])
df
条件:
- 如果列“Non_std_Spread”或“Non_std_Code”或两者均已填充并且“Negogiated_Rate”列设置为N。
- 如果列“Non_std_Spread”或“Non_std_Code”均为空且“ Negogied_Rate”列设置为 N 或 Y。
- 对于上述指标设置为Y的账户,非标准数据“Non_std_indict_1”和“Non_std_indict_2”中的指标” 需要分别与“indict_1”和“indict_2”进行比较,并报告匹配和不匹配情况。
期望的结果:
- 数据框中添加了一个新列,用于识别是否检测到匹配或不匹配,将帐户点差和代码与非标准汇率或标准汇率中的等效值进行比较。类似于“MatchOnNSR”或“MismatchOnSR”。
- 另一列或多列,用于比较当 Negotiated_Rate 标记为 Y 时指标列之间是否发生不匹配
具有预期结果的示例输出:
df=pd.DataFrame([[1234567890,3.5,'GG','N','N','Y',np.NaN,np.NaN,'N','N',3.5,'GG','MatchOnSR',True,True],
[7854567890,np.NaN,'GG','N','N','N',np.NaN,'GG','N','N',3.5,'GG','MatchOnNSR',np.NaN,np.NaN],
[9876542190,3.5,'FF','N','N','Y',np.NaN,np.NaN,'N','Y',3.5,'FI','MismatchOnSR',True,False],
[9632587415,3.5,'GG','N','N','N',3,'GG','N','N',3.5,'GG','MismatchOnSNR',np.NaN,np.NaN]],
columns = ['Account','Account_Spread','Account_Swing','indict_1','indict_2','Negotiated_Rate',
'Non_std_Spread','Non_std_Code','Non_std_indict_1','Non_std_indict_2','Std_Spread','Std_Swing','Is_Match','Match_indict_1','Match_indict_2'])
df
目前我没有任何东西可以分享来解决这个问题。我很难知道开始的最佳方法是什么。非常感谢任何帮助。
最佳答案
这个答案是对我在另一个答案中提出的一些版本相关问题的回应
您可以尝试使用掩码“cond_...”,例如:
cond_nan = df['Non_std_Spread'].isna() & df['Non_std_Code'].isna()
df.loc[cond_nan,'match_indict_1'] = df.loc[cond_nan,'indict_1'] == df.loc[cond_nan,'Non_std_indict_1']
df.loc[cond_nan,'match_indict_2'] = df.loc[cond_nan,'indict_2'] == df.loc[cond_nan,'Non_std_indict_2']
df.loc[cond_nan,'Is_Match'] = np.where(
(df.loc[cond_nan,'Account_Spread'] == df.loc[cond_nan,'Std_Spread']) & (df.loc[cond_nan,'Account_Swing'] == df.loc[cond_nan,'Std_Swing']),
"MatchOnSR", "MismatchOnNSR",
)
cond_no_nan = ~df['Non_std_Spread'].isna() & ~df['Non_std_Code'].isna() & (df['Negotiated_Rate'] == 'N')
df.loc[cond_no_nan,'Is_Match'] = np.where(
(df.loc[cond_no_nan,'Account_Spread'] == df.loc[cond_no_nan,'Non_std_Spread']) & (df.loc[cond_no_nan,'Account_Swing'] == df.loc[cond_no_nan,'Non_std_Code']),
"MatchOnSR", "MismatchOnNSR",
)
关于python - 解析 pandas Dataframe 并根据不同条件应用规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69932521/