Pandas 熊猫中的大数据,在一个表的基础上匹配和回填/转发一个表

Pandas 熊猫中的大数据,在一个表的基础上匹配和回填/转发一个表,pandas,group-by,bigdata,Pandas,Group By,Bigdata,我有一个数据帧df_原件,它是巨大的(1000万行)。索引是date(多个相同的日期),共有20行,但这里感兴趣的是Company。公司可能/不可能在每个日期都可用。这些数据可以追溯到10年前 df_原件的示例: Company 1/24/2007 Astec 1/24/2007 Abra 1/24/2007 Apple 1/24/2007 Acle ltd 1/24/2007 Apple ent 1/24/2007 Aztrazenca 1/24/

我有一个数据帧df_原件,它是巨大的(1000万行)。索引是date(多个相同的日期),共有20行,但这里感兴趣的是Company。公司可能/不可能在每个日期都可用。这些数据可以追溯到10年前

df_原件的示例:

           Company
1/24/2007   Astec
1/24/2007   Abra
1/24/2007   Apple
1/24/2007   Acle ltd
1/24/2007   Apple ent
1/24/2007   Aztrazenca
1/24/2007   Alpha ltd
1/24/2007   Altit ltd
1/24/2007   Blackberry
1/24/2007   Burberry
1/24/2007   Blue ltd
1/24/2007   Bluefin
1/25/2017   Abra
1/25/2017   Apple
1/25/2017   Acle ltd
1/25/2017   Aztrazenca
1/25/2017   Altit ltd
1/25/2017   Blackberry
1/25/2017   Burberry
1/25/2017   Blue ltd
1/25/2017   Bluefin
现在我有了另一张像这样的桌子(实际上它要大得多)。这是公司等级变化的日期(不是每日频率,只是在变化时):

df_等级变化:

            Date    Company Grade
2/2/2017    Abra        D
2/1/2017    Blue ltd    B
1/21/2017   Blue fin    C
1/1/2017    Aztrazenca  B
12/10/2016  Altit ltd   A
11/29/2016  Blackberry  C
11/18/2016  Abra        B
11/6/2016   Blue ltd    A
我想在df_original中添加一行,其中包含使用df_Grade_changes作为源的每个公司每天的等级

也就是说,当公司的等级发生变化时,它将从那天起反映在df_原件中的病房上。关键是成绩会随着时间而变化,而不是每天都在变化

在上述示例中,使用df_等级变更,从2016年11月18日到2017年2月2日前1天的Abra等级为B级,除非发生另一等级变更,否则将无限期地进行D级变更。所以我相信它可能必须从最老的到最新的,或者从最新到最老的


非常感谢您的帮助。

注意:要使下面的代码正常工作,您需要将
df_original
中的日期索引转换为正确的“日期”列

首先,在“公司”和“日期”上执行“外部”合并

这允许您在正确的日期将已知的等级更改从
df_grade_changes
添加到
df_original
,同时保留与两个数据帧关联的所有数据

接下来,您需要按公司填写上一个已知成绩条目中的未知成绩条目。定义函数并使用split-apply-combine方法与Pandas
groupby
结合可能是最简单的方法

def fill_grades_by_date(data):
    # sort by date in ascending order
    data.sort_values("date", ascending=True, inplace=True)

    # fill unknown "grade" column entries using forward fill method
    data["grade"] = data["grade"].fillna(method="ffill", inplace=False)
    return data

# Implement split-apply-combine on df_merge:
# 1. splits into tables by company
# 2. applies function `fill_grades_by_date`
# 3. combines resulting groups back into a dataframe in the format of `df_merge`
df_result = df_merge.groupby("company").apply(fill_grades_by_date).reset_index(drop=True)
您可以使用合并两个数据帧:

# Set Date as the index of df_grade_changes and ensure that it's sorted.
df_grade_changes = df_grade_changes.set_index('Date').sort_index()

# Perform the merge_asof.
df = pd.merge_asof(df_original, df_grade_changes, left_index=True, right_index=True, by='Company')
使用示例数据的输出:

               Company Grade
2007-01-24       Astec   NaN
2007-01-24        Abra   NaN
2007-01-24       Apple   NaN
2007-01-24    Acle ltd   NaN
2007-01-24   Apple ent   NaN
2007-01-24  Aztrazenca   NaN
2007-01-24   Alpha ltd   NaN
2007-01-24   Altit ltd   NaN
2007-01-24  Blackberry   NaN
2007-01-24    Burberry   NaN
2007-01-24    Blue ltd   NaN
2007-01-24     Bluefin   NaN
2017-01-25        Abra     B
2017-01-25       Apple   NaN
2017-01-25    Acle ltd   NaN
2017-01-25  Aztrazenca     B
2017-01-25   Altit ltd     A
2017-01-25  Blackberry     C
2017-01-25    Burberry   NaN
2017-01-25    Blue ltd     A
2017-01-25     Bluefin     C
               Company Grade
2007-01-24       Astec   NaN
2007-01-24        Abra   NaN
2007-01-24       Apple   NaN
2007-01-24    Acle ltd   NaN
2007-01-24   Apple ent   NaN
2007-01-24  Aztrazenca   NaN
2007-01-24   Alpha ltd   NaN
2007-01-24   Altit ltd   NaN
2007-01-24  Blackberry   NaN
2007-01-24    Burberry   NaN
2007-01-24    Blue ltd   NaN
2007-01-24     Bluefin   NaN
2017-01-25        Abra     B
2017-01-25       Apple   NaN
2017-01-25    Acle ltd   NaN
2017-01-25  Aztrazenca     B
2017-01-25   Altit ltd     A
2017-01-25  Blackberry     C
2017-01-25    Burberry   NaN
2017-01-25    Blue ltd     A
2017-01-25     Bluefin     C