在保留原始数据的条件下从 Pandas dataFrame 中删除重复项

新手上路,请多包涵

假设我有以下数据框:

  A | B
 1 | Ms
 1 | PhD
 2 | Ms
 2 | Bs

我想删除关于 A 列的重复行,并且我想保留 B 列中值为“PhD”的行作为原始行,如果我找不到“PhD”,我想保留该行B 列中的“Bs”。

我正在尝试使用

 df.drop_duplicates('A')

有条件

原文由 Rakesh Adhikesavan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 471
2 个回答
>>> df
    A   B
0   1   Ms
1   1   Ms
2   1   Ms
3   1   Ms
4   1   PhD
5   2   Ms
6   2   Ms
7   2   Bs
8   2   PhD

使用自定义函数对数据框进行排序:

 def sort_df(df, column_idx, key):
    '''Takes a dataframe, a column index and a custom function for sorting,
    returns a dataframe sorted by that column using that function'''

    col = df.ix[:,column_idx]
    df = df.ix[[i[1] for i in sorted(zip(col,range(len(col))), key=key)]]
    return df

我们的排序功能:

cmp = lambda x:2 if 'PhD' in x else 1 if 'Bs' in x else 0

在行动中:

sort_df(df,'B',cmp).drop_duplicates('A', take_last=True) PS 在现代熊猫版本中没有选项 take_last ,使用 keep 代替 - 请参阅文档

     A   B
4   1   PhD
8   2   PhD

原文由 hellpanderr 发布,翻译遵循 CC BY-SA 4.0 许可协议

考虑使用 Categoricals 。他们很好的是按非字母顺序(除其他外)对文本进行分组/排序。

 import pandas as pd
#create a pandas dataframe for testing with two columns A integer and B string
df = pd.DataFrame([(1, 'Ms'),  (1, 'PhD'),
                   (2, 'Ms'),  (2, 'Bs'),
                   (3, 'PhD'), (3, 'Bs'),
                   (4, 'Ms'),  (4, 'PhD'),   (4, 'Bs')],
                   columns=['A', 'B'])
print("Original data")
print(df)

# force the column's string column B to type 'category'
df['B'] = df['B'].astype('category')
# define the valid categories:
df['B'] = df['B'].cat.set_categories(['PhD', 'Bs', 'Ms'], ordered=True)
#pandas dataframe sort_values to inflicts order on your categories
df.sort_values(['A', 'B'], inplace=True, ascending=True)
print("Now sorted by custom categories (PhD > Bs > Ms)")
print(df)
# dropping duplicates keeps first
df_unique = df.drop_duplicates('A')
print("Keep the highest value category given duplicate integer group")
print(df_unique)

印刷:

 Original data
   A    B
0  1   Ms
1  1  PhD
2  2   Ms
3  2   Bs
4  3  PhD
5  3   Bs
6  4   Ms
7  4  PhD
8  4   Bs
Now sorted by custom categories (PhD > Bs > Ms)
   A    B
1  1  PhD
0  1   Ms
3  2   Bs
2  2   Ms
4  3  PhD
5  3   Bs
7  4  PhD
8  4   Bs
6  4   Ms
Keep the highest value category given duplicate integer group
   A    B
1  1  PhD
3  2   Bs
4  3  PhD
7  4  PhD

原文由 mattvivier 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题