簡體   English   中英

Pandas Dataframe將自定義函數應用於具有NULL列的某些行

[英]Pandas Dataframe apply custom function to certain rows with NULL columns

我有一個數據框,看起來像:

------------------------------
|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函數內部進行排序可能會有所幫助。

您可以將merge_asof與'Date method= 'nearest'上的method= 'nearest'一起使用,以在首先按'Deal'合並后找到最近的日期。 然后在df2 fillna列國家/地區

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM