我有一个数据框,我想使用“ snail_chart_dates”中的某些值填充而不使用循环。
我想要的值是按code_id分组的第一个“ value_date”,最后一个“ value_date”和中间的“ value_date”
我认为可以结合使用.iloc[0]
和.iloc[-1]
来完成此操作,但是我不知道如何将其应用于groupby
或如何获得中间值
修剪的数据框示例-另一个数据框更长
import pandas as pd
import numpy as np
returns = pd.DataFrame({
'value_date' : ['2018-01-31', '2018-02-28', '2018-03-31','2018-04-30', '2018-05-31', '2018-06-30',
'2018-01-31', '2018-02-28', '2018-03-31','2018-04-30', '2018-05-31', '2018-06-30'],
'code_id' : ['AUD','AUD','AUD','AUD','AUD','AUD',
'USD','USD','USD','USD','USD','USD'],
'gross_return': [.01, .02, .03, -.4, -.06, -.02,
.06, .8, .9, .4, -1.06, .03],
'bm_return': [.01, .02, .03, -.4, -.06, -.02,
.06, .8, .9, .4, -1.06, .03],
})
returns["snail_chart_dates"] = ""
理想结果示例-不加中间
答案 0 :(得分:1)
首先,我们获得每个组的min
和max
日期。
然后我们使用idxmin
和idxmax
获得每组这些值的索引。
要获取中间值,我们需要获取每个组的索引的median
和round up
与np.ceil
最后,我们使用loc
将这些值分配给新列:
grp = returns.groupby('code_id')
s1 = grp['value_date'].transform('min')
s2 = grp['value_date'].transform('max')
s3 = grp.apply(lambda x: np.ceil(np.median(x.index))).values
idx_min = grp['value_date'].idxmin().values
idx_max = grp['value_date'].idxmax().values
returns.loc[idx_min, 'snail_chart_dates'] = s1.loc[idx_min]
returns.loc[idx_max, 'snail_chart_dates'] = s2.loc[idx_max]
returns.loc[s3, 'snail_chart_dates'] = returns.loc[s3, 'value_date']
value_date code_id gross_return bm_return snail_chart_dates
0 2018-01-31 AUD 0.01 0.01 2018-01-31
1 2018-02-28 AUD 0.02 0.02 NaT
2 2018-03-31 AUD 0.03 0.03 NaT
3 2018-04-30 AUD -0.40 -0.40 2018-04-30
4 2018-05-31 AUD -0.06 -0.06 NaT
5 2018-06-30 AUD -0.02 -0.02 2018-06-30
6 2018-01-31 USD 0.06 0.06 2018-01-31
7 2018-02-28 USD 0.80 0.80 NaT
8 2018-03-31 USD 0.90 0.90 NaT
9 2018-04-30 USD 0.40 0.40 2018-04-30
10 2018-05-31 USD -1.06 -1.06 NaT
11 2018-06-30 USD 0.03 0.03 2018-06-30
答案 1 :(得分:0)
假设您将value_date
放入Pandas日期时间格式,则有一个非常简单的解决方案。
我们可以按代码分组,然后使用.quantile()
函数获取日期。
returns["value_date"] = pd.to_datetime(returns["value_date"])
code_groups = returns.groupby("code_id")["value_date"]
code_groups.quantile(0, interpolation="nearest")
code_id
AUD 2018-01-31
USD 2018-01-31
Name: value_date, dtype: datetime64[ns]
code_groups.quantile(0.5, interpolation="nearest")
code_id
AUD 2018-03-31
USD 2018-03-31
Name: value_date, dtype: datetime64[ns]
然后您可以根据需要将此信息分配到表中。