根据条件从熊猫系列中删除重复项

时间:2018-08-02 17:27:32

标签: python python-3.x pandas

我的熊猫系列如下:

    increased   1.691759
    increased   1.601759
    reports     1.881759
    reports     1.491759
    president   1.386294
    president   1.791759
    exclusive   1.381759
    exclusive   1.291759
    bank        1.386294
    bank        1.791759
    ........    ........
    ........    .......

我只想从序列中删除重复的单词,并保留具有较高数值的单词。因此,预期输出,

increased   1.691759
reports     1.881759
president   1.791759
exclusive   1.381759
bank        1.791759
........    ........
........    .......

我通过将系列转换为pandas数据框进行了尝试,效果很好。但是,这将是一个非常耗时的过程,因为我有很多文章。因此,我只想在现有系列中进行处理。

2 个答案:

答案 0 :(得分:5)

drop_duplicates排序后,可以使用col2。默认情况下,删除重复项将保留第一个副本,因此,如果按col2排序,则最大的副本将排在最前面,

df.sort_values('col2', ascending=False).drop_duplicates('col1')

        col1      col2
2    reports  1.881759
5  president  1.791759
9       bank  1.791759
0  increased  1.691759
6  exclusive  1.381759

替代使用groupbytail

另一种方法是:

df.sort_values('col2').groupby('col1').tail(1)

        col1      col2
6  exclusive  1.381759
0  increased  1.691759
5  president  1.791759
9       bank  1.791759
2    reports  1.881759

编辑:根据您的评论,要转换为系列以供进一步使用,您可以执行以下操作:

df.sort_values('col2', ascending=False).drop_duplicates('col1').set_index('col1')['col2']

col1
reports      1.881759
president    1.791759
bank         1.791759
increased    1.691759
exclusive    1.381759
Name: col2, dtype: float64

或者直接在该系列中进行分组(但这比较慢,请参见基准):

s.sort_values().groupby(s.index).tail(1)

基准

我用长度为1000000的Series进行了测试,即使将其转换为数据帧并返回到系列,也只花了不到一秒钟的时间。您可能可以找到一种更快的方法而无需进行转换,但是IMO并不是很糟糕

df = pd.DataFrame({'col1':np.random.choice(['increased', 'reports', 'president', 'exclusive', 'bank'], 1000000), 'col2':np.random.randn(1000000)})

s = pd.Series(df.set_index('col1').col2)

>>> s.head()
col1
president    0.600691
increased    1.752238
president   -1.409425
bank         0.349149
reports      0.596207
Name: col2, dtype: float64
>>> len(s)
1000000

import timeit

def test(s = s):
    return s.to_frame().reset_index().sort_values('col2', ascending=False).drop_duplicates('col1').set_index('col1')['col2']

>>> timeit.timeit(test, number=10) / 10
0.685569432300008

直接在系列上应用groupby会更慢:

def gb_test(s=s):
    return s.sort_values().groupby(s.index).tail(1)

>>> timeit.timeit(gb_test, number=10) / 10
0.7673859989999983

答案 1 :(得分:0)

我不确定该方法是否适用于Pandas Dataframe,但您可以尝试使用set()函数。 set()函数删除所有重复项。