我有一个数据集,其中包含国家/地区GEOGN
的列及其历史数据。我已按国家/地区对数据进行了分组,并删除了df
低于每个国家NaN
的5%分位数的所有行。代码如下:
def replace(group):
quantile = group.quantile(0.05)
smallest_five = group < quantile
group[smallest_five ] = np.NaN
return group
df = df.groupby('GEOGN').apply(replace)
请考虑以下数据框:
GEOGN 2009-06 2010-01 2010-02 ... 2011-02 2011-03 2011-04 2011-05
0 GER 1 4 10 ... 4 7 6 3
1 GER 5 6 9 ... 6 2 10 2
2 GER 1 4 7 ... 4 8 6 6
3 GER 10 9 6 ... 6 2 1 8
4 USA 9 9 5 ... 10 3 1 10
5 USA 2 4 5 ... 4 5 4 3
6 USA 3 4 3 ... 8 4 2 1
7 USA 10 2 8 ... 2 3 9 9
现在,我想根据条件执行相同的操作。
首先,该操作应检查month < 6
或month > 5
在每一列中是否为真。如果第一个语句为true,则它应该执行与上面稍有不同的操作。它应该将df
与之前的5%分位数:outliers = group < quantile.shift(1)
进行比较。
以下是我目前使用的方法的大致概念:
def replace(group):
quantile = group.quantile(0.05)
smallest_five = group < quantile.shift(1)
group[smallest_five] = np.NaN
return group
def replace_next(group):
quantile = group.quantile(0.05)
smallest_five = group < quantile
group[smallest_five] = np.NaN
return group
for column_name in df.drop(df.columns[range(1)], axis=1):
column_date = pd.to_datetime(column_name)
if column_date.month < 6:
df.groupby('GEOGN').apply(replace)
else:
df.groupby('GEOGN').apply(replace_next)
赞赏任何建议。