Pandas 熊猫中的大数据,在一个表的基础上匹配和回填/转发一个表
我有一个数据帧df_原件,它是巨大的(1000万行)。索引是date(多个相同的日期),共有20行,但这里感兴趣的是Company。公司可能/不可能在每个日期都可用。这些数据可以追溯到10年前 df_原件的示例: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/
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方法与Pandasgroupby
结合可能是最简单的方法
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