我有一個非常大的熊貓資料框,其中包含兩列,A 列和 B 列。對于 A 列中的每個值,我想在 B 列中找到小于 A 列中相應值的最大值。請注意,每個B列中的值可以映射到A列中的許多值。
這是一個較小資料集的示例。假設我有以下資料框:
df = pd.DataFrame({'a' : [1, 5, 7, 2, 3, 4], 'b' : [5, 2, 7, 5, 1, 9]})
我想找到一些第三列——比如 c——這樣
c = [nil, 2, 5, 1, 2, 2].
請注意, 中的每個條目c都嚴格小于 中的相應值c。
經過研究,我認為我想要類似的東西pandas.merge_asof,但我不能完全正確地得到查詢。特別是,我很掙扎,因為我只有一個資料框而不是兩個。也許我可以從我當前的資料框中形成第二個資料框來獲得我需要的東西,但我不能完全正確。任何幫助表示贊賞。
uj5u.com熱心網友回復:
是的,使用pandas.merge_asof. 解釋為代碼中的注釋 -
import pandas as pd
df = pd.DataFrame({'a' : [1, 5, 7, 2, 3, 4], 'b' : [5, 2, 7, 5, 1, 9]})
# merge_asof requires the keys to be sorted
adf = df[['a']].sort_values(by='a')
bdf = df[['b']].sort_values(by='b')
# your example wants 'strictly less' so we also add 'allow_exact_matches=False'
cdf_ordered = pd.merge_asof(adf, bdf, left_on='a', right_on='b', allow_exact_matches=False, direction='backward')
# rename the dataframe |a|b| -> |a|c|
cdf_ordered = cdf_ordered.rename(columns={'b': 'c'})
# since c is based on sorted a, we merge with original dataframe column a
new_df = pd.merge(df, cdf_ordered, on='a')
print(new_df)
"""
a b c
0 1 5 NaN
1 5 2 2.0
2 7 7 5.0
3 2 5 1.0
4 3 1 2.0
5 4 9 2.0
"""
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/496115.html
