我有以下熊猫数据框:
索引 | so_id |
---|---|
10 | 390 |
10 | 395 |
10 | 405 |
11 | 390 |
11 | 395 |
11 | 405 |
12 | 390 |
12 | 395 |
12 | 405 |
所需的输出如下:
索引 | so_id |
---|---|
10 | 390 |
11 | 395 |
12 | 405 |
基本上我的目标是删除列 'index' 上的重复项,同时为列 'so_id' 保留不同的升序值
答案 0 :(得分:1)
我们可以做到,但重要的是,请注意上面的评论。
df=df.sort_values (by=['so_id'])#Sort df
创建临时列t
,它是so_id
和resort
df
的分类回到原来的df=df.assign(t=df['so_id'].ne(df['so_id'].shift(1)).cumsum()).sort_values(by='index')
创建索引的临时分类
df=df.assign(t1=df['index'].ne(df['index'].shift(1)).cumsum())
选择上面两个类相似的地方
df=df[df['t']==df['t1']].drop(columns=['t','t1'])
print(df)
index so_id
0 10 390
4 11 395
8 12 405
答案 1 :(得分:1)
在这里,我创建了一个字典,通过将值添加到集合以获得唯一值,然后按所需的升序排序,将旧索引映射到新索引。字典形成后,我们可以检查特定行中的值是否与字典中的数据匹配,如果匹配,则该组合是正确的,我们对该行不做任何事情,如果不匹配,我们只需删除那一行:
import pandas as pd
df = pd.DataFrame([[10, 390], [10, 395], [10, 405], [11, 390], [11, 395], [11, 405], [12, 390], [12, 395], [12, 405]], columns=['id', 'so_id'])
idx_map = {}
idx=set()
new_idx=set()
for row in df.iterrows():
idx.add(row[1]['id'])
new_idx.add(row[1]['so_id'])
for i in range(len(idx)):
idx_map[sorted(idx)[i]]=sorted(new_idx)[i]
for idx, row in df.iterrows():
if idx_map[row[0]]==row[1]:
continue
else:
df = df.drop(idx)
print(df)
输出
id so_id
0 10 390
4 11 395
8 12 405
这里,idx_map 字典是这样的:
{10: 390, 11: 395, 12: 405}