首页 > 解决方案 > 如何通过有条件地查找另一个 DF 并将结果水平附加到新的 DF 中来创建 DF?

问题描述

我有两个数据框 - df1 包含所有数据,df2 将成为查找 df1 的基础。我需要在 DF2 中创建一个每行一行的“结果”数据框,其中每一行应该是 DF2 中的原始行,然后水平地是 DF1 中与 ID 匹配的每一行,并且日期早于或等于到指定的日期。

我实际上需要在 DF1 中找到与 DF2 中给定行的 ID 和所有先前日期相对应的迷你数据帧(参见下面的代码片段),然后将所述迷你 DF 的每一行附加到 DF2 的右侧。

我了解,根据代码片段 1,如何根据 DF2 中的条件找到 mini_df,但是我不知道如何创建水平包含附加行的新数据框。理想情况下,我想指定我从所述数据框中获取的行数,例如,如果 10 行与 ID 和之前或日期标准匹配,我想取其中的 6 行。

    #code snippet 1 to create mini dataframe from df1 for each row in df2
    mini_df = df1[(df1['ID']=='A0') & (df1['Date']<='20200102')] 
    df1
      ID1     Date1  Value
    0  A0  20200101    123
    1  A0  20200102    234
    2  A0  20200103    345
    3  A1  20200101    456
    4  A1  20200102    567
    5  A1  20200103    678

    df2
      ID2   Date2
    0  A0  20200103    
    1  A1  20200103    

    result
      ID2   Date2        ID1-1  Date1-1 Value-1     ID1-2  Date1-2 Value-2     ID1-3  Date1-3 Value-3  
    0  A0  20200103        A0  20200101   123        A0   20200102   234        A0   20200103   345   
    1  A1  20200103        A1  20200101   456        A1   20200102   567        A1   20200103   678   

重现表格的代码:

    import pandas as pd

    df1 = pd.DataFrame({'ID1': ['A0', 'A0','A0', 'A1', 'A1', 'A1'],
                        'Date1': ['20200101', '20200102','20200103', '20200101', '20200102','20200103'],
                        'Value':[123,234,345,456,567,678]})

    df2 = pd.DataFrame({'ID2': ['A0', 'A1'],'Date2': ['20200102', '20200102',],})

    result = pd.DataFrame({'ID2':['A0','A1'],
                           'Date1':['20200102', '20200102',],
                           'ID1-1':['A0','A1'],
                           'Date1-1': ['20200101','20200101'],
                           'Value-1':[123,456],
                           'ID1-2':['A0','A1'],
                           'Date1-2': ['20200102','20200102'],
                           'Value-2':[234,567],
                           'ID1-3':['A0','A1'],
                           'Date1-3': ['20200103','20200103'],
                           'Value-3':[345,678],                       
                          })

提前感谢您的任何建议。

标签: pythonpandasdataframe

解决方案


如果您像这样向第一个 df 添加一列:

df1 = pd.DataFrame([
[ 'A0',20200101, 123,1],
[ 'A0',20200102, 234,2],
[ 'A0',20200103, 345,3],
[ 'A1',20200101, 456,1],
[ 'A1',20200102, 567,2],
[ 'A1',20200103, 678,3]
],columns=['ID1','Date1','Value','cat'])

df2 = pd.DataFrame([
[ 'A0',20200103],
[ 'A1',20200103]
],columns=['ID2','Date2'])

您可以将 df2 与 df1 中的 df 组合并:

for group in df1.groupby('cat'):
    print(group[1].iloc[0]['cat'])
    df2 = df2.merge(
        group[1][['ID1','Date1','Value']],
        left_on='ID2',
        right_on='ID1',
    )

推荐阅读