2024-03-28 15:49:27 发布
网友
我有这样一个数据框:
df col1 col2 1 10 2 15 4 12 5 23 6 11 8 32 9 12 11 32 2 23 3 21 4 12 6 15 9 12 10 32
我想为col1的每1、5和10个值选择col2值。如果col1值不是1、5或10,则保留col1值最接近1、5或10的col2值
例如,最终df将如下所示:
df col1 col2 1 10 5 23 11 32 2 23 6 15 10 32
如何使用熊猫而不使用任何循环
与pir的方法非常相似
s=df.col1.diff().lt(0).cumsum() idx=df.reset_index().groupby(s).apply(lambda x : x.set_index('col1').reindex([1,5,10],method='nearest'))['index'] df.loc[idx] Out[19]: col1 col2 0 1 10 3 5 23 7 11 32 8 2 23 11 6 15 13 10 32
另一种获取索引merge_asof
merge_asof
df['key']=s import itertools l=list(itertools.product(df.key.unique().tolist(),[1,5,10])) mergedf=pd.DataFrame(l,columns=['key','col1']).astype(int) df.col1=df.col1.astype('int32') idx=pd.merge_asof(mergedf.sort_values('col1'),df.reset_index().sort_values('col1'),on='col1',by='key',direction ='nearest')['index']
试试这个:
def extract_vals(x, vals=[1,5,10]): vals = np.array(vals) s = abs(x['col1'].values - vals[:,None]) return x.iloc[s.argmin(axis=1)] s = df.col1.diff().lt(0).cumsum() df.groupby(s).apply(extract_vals).reset_index(drop=True)
由于第二组中存在4,6,因此输出与您的不同:
4,6
col1 col2 0 1 10 1 5 23 2 9 12 3 2 23 4 4 12 5 10 32
df.col1.diff().lt(0).cumsum()
set_index
col1
drop=False
groupby
pd.concat
reindex
method='nearest'
我留下了旧的col1索引,以便您可以看到映射到什么的内容。你知道吗
c = df.set_index([df.col1.diff().lt(0).cumsum().rename('grp'), 'col1'], drop=False) pd.concat([c.xs(k).reindex([1, 5, 10], method='nearest') for k, c in c.groupby(level=0)]) col1 col2 col1 1 1 10 5 5 23 10 11 32 1 2 23 5 6 15 10 10 32
如果您不喜欢索引中额外的col1,可以重命名索引,然后删除它:
c = df.set_index([df.col1.diff().lt(0).cumsum().rename('grp'), 'col1'], drop=False) pd.concat([c.xs(k).reindex([1, 5, 10], method='nearest') for k, c in c.groupby(level=0)]) \ .rename_axis(None).reset_index(drop=True) col1 col2 0 1 10 1 5 23 2 11 32 3 2 23 4 6 15 5 10 32
与pir的方法非常相似
另一种获取索引
merge_asof
试试这个:
由于第二组中存在
4,6
,因此输出与您的不同:df.col1.diff().lt(0).cumsum()
定义升序值组set_index
与那些组和col1
但将col1
与drop=False
保持在数据帧中groupby
和pd.concat
使用reindex
和method='nearest'
我留下了旧的
col1
索引,以便您可以看到映射到什么的内容。你知道吗如果您不喜欢索引中额外的
col1
,可以重命名索引,然后删除它:相关问题 更多 >
编程相关推荐