我正在嘗試使用最小日期和最大日期來計算價值增長/下降。我的資料目前看起來像這樣:
Code Date Value 0 A 2020-12-31 80122.0 1 A 2019-12-31 45472.0 2 A 2018-12-31 31917.0 3 A 2017-12-31 23432.0 4 B 2020-12-31 0.0
對于代碼 AI,需要保留最大 (2020-12-31) 和最小 (2017-12-31) 日期以及值,以便我稍后計算差異。我有多個代碼,需要能夠對每個代碼應用相同的邏輯。有關解決此問題的最佳方法的任何建議?
謝謝
uj5u.com熱心網友回復:
在您的情況下,您想對日期進行排序,然后分組并首先提取,最后提取:
df.sort_values(['Code','Date']).groupby('Code')['Value'].agg(['first','last'])
輸出:
first last
Code
A 23432.0 80122.0
B 0.0 0.0
uj5u.com熱心網友回復:
我會首先sort_values然后你可以drop_duplicates在“代碼”上。keep為此使用不同的邏輯可以讓您獲得每個“代碼”中的第一行和最后一行(基于日期),然后您可以減去這些行以獲得每個代碼的日差和值差。
df = df.sort_values(['Code', 'Date'])
(df.drop_duplicates('Code', keep='last').set_index('Code')
- df.drop_duplicates('Code', keep='first').set_index('Code'))
# Date Value
#Code
#A 1096 days 56690.0
#B 0 days 0.0
或者,如果您不僅需要差異而且實際上需要行,那么我會將concat它們放在一起而不是減去。避免.first聚合的主要原因是因為它不保證dropna在空值的情況下資料來自相同的行(沒有指定)。
pd.concat([df.drop_duplicates('Code', keep='last').set_index('Code'),
df.drop_duplicates('Code', keep='first').set_index('Code')],
keys=['Last', 'First'], axis=1)
# Last First
# Date Value Date Value
#Code
#A 2020-12-31 80122.0 2017-12-31 23432.0
#B 2020-12-31 0.0 2020-12-31 0.0
uj5u.com熱心網友回復:
自從你
需要保留最大 (2020-12-31) 和最小 (2017-12-31) 日期以及值...
, 你可以試試:
df = pd.DataFrame({'Code':['A','A','A','A','B'],
'Date': ['2020-12-31', '2019-12-31', '2018-12-31', '2017-12-31', '2020-12-31'],
'Value': [80122.0, 45472.0, 31917.0, 23432.0, 0.0]
}, )
df.loc[:, 'Date'] = pd.to_datetime(df.loc[:, 'Date'])
是 df 提到的:
Code Date Value
0 A 2020-12-31 80122.0
1 A 2019-12-31 45472.0
2 A 2018-12-31 31917.0
3 A 2017-12-31 23432.0
4 B 2020-12-31 0.0
所以另一種方式可以是:
dictionary = {}
for code in df.loc[:, 'Code'].unique():
dictionary[code] = {'Date min': df.loc[df.loc[:, 'Code']==code,'Date'].min(),
'Value min': df.loc[(df.loc[:, 'Code']==code)& (df.loc[:,'Date'] == df.loc[df.loc[:, 'Code']==code,'Date'].min()), 'Value'].values[0],
'Date max': df.loc[df.loc[:, 'Code']==code,'Date'].max(),
'Value max':df.loc[(df.loc[:, 'Code']==code)&(df.loc[:,'Date'] == df.loc[df.loc[:, 'Code']==code,'Date'].max()), 'Value'].values[0]
}
resume = pd.DataFrame(dictionary)
resume = resume.transpose()
resume
輸出:
Date min Value min Date max Value max
A 2017-12-31 23432.0 2020-12-31 80122.0
B 2020-12-31 0.0 2020-12-31 0.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/383047.html
