我有dataFrame,我需要根据另一列'abs(col1-col2)'中的最小值删除每个组('col1')的重复项,但是我需要通过取最后一个组来更改此条件“ abs(col1-col2)”中的最大值对应于“ col1”中的最后一个组,在该组中,我对“ col1”进行了升序排序。 (表现为循环)
我需要动态分配最后一组。
例如,如果我的数据框为
df = pd.DataFrame( {'col0':['A','A','A','A','A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B','B','B','B','B'],'col1':[1,1,1,2,2,2,3,3,3,4,4,4,2,2,2,3,3,3,4,4,4,5,5,5], 'col2':[2,3,4,1,3,4,1,2,4,1,2,3,3,4,5,2,4,5,2,3,5,2,3,4]})
df['abs(col1 - col2)']=abs(df['col1']-df['col2'])
我的审判:
df.sort_values(by=['col0','col1','abs(col1 - col2)','col2'],ascending=[True,True,True,False]).drop_duplicates(['col0','col1'])
结果如下:
答案 0 :(得分:2)
如果我的理解正确,那么您每次在col1
上达到最大值时都希望每个排序顺序不同。
df.groupby(['col0'], as_index=False)['col1'].max()
df
df
来获得这些组:pd.merge(df, col1_max_groups)
DataFrame
完整示例:
col1_max_groups = df.groupby(['col0'], as_index=False)['col1'].max()
deduped = df.sort_values(['col0', 'col1', 'abs(col1 - col2)', 'col2'],
ascending=[True, True, True, False]) \
.drop_duplicates(['col0', 'col1']) \
.set_index(['col0', 'col1'])
update = pd.merge(df, col1_max_groups) \
.sort_values(['col0', 'col1', 'abs(col1 - col2)', 'col2'],
ascending=[True, True, False, False]) \
.drop_duplicates(['col0', 'col1'])
deduped.update(update.set_index(['col0', 'col1']))
deduped.reset_index()
# returns
# col0 col1 col2 abs(col1 - col2)
# A 1 2 1
# A 2 3 1
# A 3 4 1
# A 4 1 3
# B 2 3 1
# B 3 4 1
# B 4 5 1
# B 5 2 3
答案 1 :(得分:1)
如果要获得此特定结果,则可以拆分数据框并使用两个不同的规则,然后再次合并它们。例如:
import pandas as pd
df = pd.DataFrame( {'col1':[1,1,1,2,2,2,3,3,3,4,4,4], 'col2':[2,3,4,1,3,4,1,2,4,1,2,3]})
df['abs(col1 - col2)']=abs(df['col1']-df['col2'])
df = df.sort_values(by=['col1','abs(col1 - col2)','col2'],ascending=[True,True,False]).drop_duplicates('col1')
df1 = df.loc[df['col1'] != 4]
df2 = df.loc[df['col1'] == 4]
df2 = df2.sort_values(by=['col1','abs(col1 - col2)','col2'],ascending=[True,True,False])
df2Last = df2.tail(1)
df = pd.concat([df1, df2Last])
结果:
col1 col2 abs(col1 - col2)
1 2 1
2 3 1
3 4 1
4 1 3