基于Python DataFrame中的单个值的查找组四分位数



我有一个DataFramedf1,其中包含不同国家/地区IDsScores的每日时间序列C。对于国家,我有一个额外的DataFramedf2,它为每个国家包含4个四分位数Q,分位数得分为Q_Scores

df1:
Date       ID  C    Score
20220102   A   US   12.6
20220103   A   US   11.3
20220104   A   US   13.2
20220105   A   US   14.5
20220102   B   US   9.8
20220103   B   US   19.8
20220104   B   US   12.3
20220105   B   US   15.1
20220102   C   GB   13.5
20220103   C   GB   14.5
20220104   C   GB   11.5
20220105   C   GB   14.8
df2:
Date      C   Q  Q_Score
20220102  US  1  10
20220103  US  2  13
20220104  US  3  16
20220105  US  4  20
20220102  GB  1  12
20220103  GB  2  13
20220104  GB  3  14
20220105  GB  4  15

我尝试查找四分位数得分Q_Score,并创建一个名为Q_Scores的附加列df3。一个特定的分数应该从特定国家的df2中查找下一个较大的四分位数分数。例如:

  • 20220104/A/US:得分=13.2->在美国,下一个更大的四分位数是16->Q分数:16
df3:
Date       ID  C    Score  Q_Score
20220102   A   US   12.6   13
20220103   A   US   11.3   13
20220104   A   US   13.2   16
20220105   A   US   14.5   16
20220102   B   US   9.8    10
20220103   B   US   19.8   20
20220104   B   US   12.3   13
20220105   B   US   15.1   16
20220102   C   GB   13.5   14
20220103   C   GB   14.5   15
20220104   C   GB   11.5   12
20220105   C   GB   14.8   15

因为ScoreQ_Score不匹配,所以我无法使用简单的pd.merge()

您可以使用pd.merge_asof,但需要一些处理:

# two data must have the same data type
df2['Q_Score'] = df2['Q_Score'].astype('float64')
# keys must be sorted
pd.merge_asof(df1.sort_values('Score'),
df2.drop(['Date','Q'], axis=1).sort_values('Q_Score'), 
by=['C'],
left_on='Score', 
right_on='Q_Score',
direction='forward'
).sort_values(['ID','Date'])

输出:

Date ID   C  Score  Q_Score
4   20220102  A  US   12.6     13.0
1   20220103  A  US   11.3     13.0
5   20220104  A  US   13.2     16.0
7   20220105  A  US   14.5     16.0
0   20220102  B  US    9.8     10.0
11  20220103  B  US   19.8     20.0
3   20220104  B  US   12.3     13.0
10  20220105  B  US   15.1     16.0
6   20220102  C  GB   13.5     14.0
8   20220103  C  GB   14.5     15.0
2   20220104  C  GB   11.5     12.0
9   20220105  C  GB   14.8     15.0

最新更新