Python Dataframe将自定义函数应用于具有空列的某些行

Python Dataframe将自定义函数应用于具有空列的某些行,python,pandas,pandas-groupby,sklearn-pandas,django-pandas,Python,Pandas,Pandas Groupby,Sklearn Pandas,Django Pandas,我有一个数据框,看起来像: ------------------------------ |Date | Deal | Country | ------------------------------ |2019-01-02 | ABC | US | ------------------------------ |2019-02-01 | ABC | US | ------------------------------ |2019-03-03 | ABC

我有一个数据框,看起来像:

------------------------------
|Date       | Deal | Country |
------------------------------
|2019-01-02 | ABC  | US      |
------------------------------
|2019-02-01 | ABC  | US      |
------------------------------
|2019-03-03 | ABC  | US      |
------------------------------
另一个看起来与基于特定逻辑填充的国家相似的数据框

------------------------------
|Date       | Deal | Country |
------------------------------
|2019-01-01 | ABC  | NaN      |
------------------------------
|2019-02-01 | ABC  | US      |
------------------------------
|2019-03-02 | ABC  | NaN      |
------------------------------
请注意,日期不同。在第二个数据框中,我希望通过引用第一个数据框中最新的国家标签来填充空国家标签, 所以我可以这样做, 在第一个数据框中搜索交易,并按日期降序排序,获取最新的国家/地区列以填充第二个数据框。 然而,对于200多万行来说,这变得非常缓慢

有没有更好的办法

我尝试了
groupby(['Date','Deal']).agg(lambda x:sorted(x)[0])
但无法与第一个数据帧合并,因为日期不匹配。我只需要根据日期将最近的国家/地区标签填入

任何关于这方面的建议都将不胜感激!提前谢谢

import pandas as pd
import numpy as np

tbl1 = pd.DataFrame({'Country': {0: 'US0', 1: 'US1', 2: 'US2'}, 'Date': {0: '2019-01-02', 1: '2019-02-01', 2: '2019-03-03'}, 'Deal': {0: 'ABC', 1: 'ABC', 2: 'ABC'}})
tbl2 = pd.DataFrame({'Country': {0: 'US', 1: np.nan, 2: np.nan}, 'Date': {0: '2019-01-01', 1: '2019-02-01', 2: '2019-03-02'}, 'Deal': {0: 'ABC', 1: 'ABC', 2: 'ABC'}})

print(tbl1)
print(tbl2)

t1_index = pd.MultiIndex.from_frame(tbl1[['Deal','Date']])
tbl1.index = t1_index
tbl1.sort_index(inplace=True)

tbl2['country_filled'] = tbl2.apply(lambda row: row['Country'] if pd.notnull(row['Country']) 
                                    else tbl1.xs(row['Deal'],level='Deal').loc[:row['Date']]['Country'][-1],
                                    axis=1)

print(tbl1)
print(tbl2)
在进行查找之前先对表1进行排序,而不是在agg函数中进行排序可能会有所帮助。

您可以在“日期”上使用
方法=“最近的日期”
,以便在先按“交易”合并后查找最近的日期。然后
fillna
df2

df2 = df2.fillna(pd.merge_asof(df2.drop('Country', axis=1), df1, 
                               by='Deal', # merge first on same Deal
                               on='Date', # merge on nearest date
                               direction='nearest')) #closest date

请你把df.head()分享给我好吗?当然,这是第一个{‘国家’:{0:US',1:US',2:US',日期:{0:2019-01-02',1:2019-02-01',2:2019-03-03',交易:{0:ABC',1:ABC',2:ABC'}和第二个{‘国家’:{0:US',1:US',2:US',日期:{0:2019 01-01',1:2019 02-01',2:2019 03-02',交易'{0:'ABC',1:'ABC',2:'ABC'}}这两个表都有200多万行,还是第二个表比第一个表大得多?第二个表实际上比第一个表小(小50%),大约有100万行