我的熊猫系列如下:
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数据框进行了尝试,效果很好。但是,这将是一个非常耗时的过程,因为我有很多文章。因此,我只想在现有系列中进行处理。
答案 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
替代使用groupby
和tail
:
另一种方法是:
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()
函数删除所有重复项。