【问题标题】:Running multiple conditions on two dataframes using the merge function to create pairs使用合并功能在两个数据帧上运行多个条件以创建对
【发布时间】:2020-04-05 06:00:04
【问题描述】:

我有两个数据框 -

ID  Currency_a  Amount_a    Date_a
1   CAD         100         12-Jan
2   CAD         200         12-Feb
3   USD         200         15-Aug
4   USD         200         12-Jan
5   EUR         200         12-Feb
ID  Currency_b  Amount_b    Date_b
6   CAD         500         25-Jan
7   CAD         600         13-Feb
8   USD         200         15-Aug
9   USD         400         20-Jan
10  EUR         200         12-Feb

任务是从 2 个各自的数据帧中创建一对 (ID,ID),如果 -

货币相同

Amount_a + Amount_b > 600

Date_a 和 Date_b 之间的时间段小于 10 天

所以这种情况下的输出应该是

(2,7), (4,9)

我正在使用(但它似乎不起作用:()-

a.merge(b, on='Currency).query('Amount_a + Amount_b > 600' and 'abs((Date_a - Date_b).dt.days) > 10').filter(like='ID').values.tolist()

【问题讨论】:

  • (4, 9) 等于 600 不大于 600。应该是>= 600
  • 你为解决这个问题做了什么?

标签: python pandas dataframe conditional-statements


【解决方案1】:

试试:

df1['Date_a'] = pd.to_datetime(df1['Date_a'], format='%d-%b')
df2['Date_b'] = pd.to_datetime(df2['Date_b'], format='%d-%b')

df_out = pd.merge_asof(df1.sort_values('Date_a'), 
              df2.sort_values('Date_b'), 
              left_on='Date_a', 
              right_on='Date_b', 
              left_by='Currency_a', 
              right_by='Currency_b', 
              tolerance=pd.Timedelta(days=10), 
              direction='nearest')

df_out.query('Amount_a+Amount_b >= 600')[['ID_x','ID_y']].apply(tuple, axis=1).tolist()

输出:

[(4.0, 9.0), (2.0, 7.0)]

【讨论】:

    【解决方案2】:

    query 不支持dt.days。所以也许是这样的:

    (df1.merge(df2, left_on='Currency_a', right_on='Currency_b')
        .assign(date_diff=lambda x: x.Date_a.sub(x.Date_b).dt.days.abs())
        .query('date_diff < 10 & Amount_a + Amount_b > 600')
        .filter(like='ID')
        .values
    )
    

    【讨论】:

    • SyntaxError: EOL 同时扫描字符串文字
    猜你喜欢
    • 2018-02-18
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多