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万行