【问题标题】:Iterate through two dataframes and filter based on conditions in columns遍历两个数据框并根据列中的条件进行过滤
【发布时间】:2022-01-03 05:28:39
【问题描述】:

我有两个如下所示的 DataFrame:

df_1 = pd.DataFrame({
    'wag': [111, 111, 222], 
    'date': ['2019-08-30', '2019-09-20', '2019-08-10']
})

df_2 = pd.DataFrame({
    'wag': [111, 111, 111, 222, 222, 333, 333, 333], 
    'msr_date': ['2019-08-30', '2019-08-30', '2019-08-30', 
                 '2019-08-30', '2019-08-30', '2019-08-30', 
                 '2019-08-30', '2019-08-30'], 
    'measurements': [1, 2, 3, 4, 5, 6, 7, 8]
})

df_1df_2 如下:

wag date
111 2019-08-30
111 2019-09-20
222 2019-08-10
wag msr_date measurements
111 2019-03-29 1
111 2019-03-19 2
111 2019-03-10 3
222 2019-09-30 4
222 2019-09-20 5
333 2019-08-30 6
333 2019-08-30 7
333 2019-09-20 8

所以,我有两个 DataFrames df_1df_2,我想同时遍历它们并过滤 df_2。我需要在两个表中都基于wag 进行迭代。

如果df_1中的wagdf_2中,那么我必须比较datemrs_date

  • 如果mrs_date <= date 然后我追加wag 的所有行
  • 否则,我会检查 df_1 中的该行是否还有一个条件,对于该 wag 并再次重复日期比较。
  • 当该 wags 的条件/行完成后,我们将转到 wag 的下一个值。

例如,这里我首先检查df_1 的第一行,如果df_2 中的mrs_date <= date 则将所有行追加到df_new。如果没有,那么我会去下一个date 寻找那个wag。如果我们有,如果没有,请检查另一个wag。所以最后,对于这个例子,我会得到df_new,如下所示:

wag msr_date measurements
111 2019-03-29 1
111 2019-03-19 2
111 2019-03-10 3

实际上,df_1df_2 中有很多值,所以for_loop 应该很复杂,我找不到方法。如果不清楚我是如何描述任务的,请询问。

【问题讨论】:

    标签: python pandas dataframe for-loop


    【解决方案1】:

    使用 for 循环:

    new_df = pd.DataFrame(data=None, columns=df_2.columns)
    
    for idx, row in df_1.iterrows():
      for idx2, row2 in df_2.iterrows():
        if row['wag'] == row2['wag'] and row2['msr_date'] <= row['date']:
          new_df = new_df.append(row2).drop_duplicates()
    

    【讨论】:

    • 在这种情况下使用 for 循环没有意义,因为它会很慢;你这样会失去 Pandas 的速度
    【解决方案2】:

    合并 wag 列上的 2 个数据框,然后仅保留符合您的条件 msr_date &lt;= date 的行。最后,从df_1 中删除date 列并删除重复行。

    >>> df_2.merge(df_1, on='wag', how='left') \
            .query('msr_date <= date') \
            .drop(columns='date').drop_duplicates()
    
       wag    msr_date  measurements
    0  111  2019-03-29             1
    2  111  2019-03-19             2
    4  111  2019-03-10             3
    

    【讨论】:

    • @sammywemmy。我没能让它工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多