如何保留最新值并删除列中的所有其他值(pandas)

问题描述 投票:0回答:4

我正在尝试获取 ID 名称的最新出现,并且我想删除该时间之前发生的所有其他出现的情况。

    ID Name     Comment        Time
0     W12D0       Fine     12:17:37
1     W12D0     Random     12:20:10
2     W12D0       What     12:21:06
3     W12D4       Fine     08:20:14
4     W12D5     Random     10:11:12
5     W12D5       Fine     11:37:02
..      ...        ...         ....

例如(根据上面的数据),“ID 名称”“W12D0”与 3 次出现相关联: 12:17:37、12:20:10、12:21:06

我只想保留与该 ID 名称的最新时间关联的行(在本例中为 12:21:06)。每隔一个带有 W12D0 的行将被删除。本质上,我想要这样的东西:

    ID Name     Comment        Time
0     W12D0       What     12:21:06
1     W12D4       Fine     08:20:14
2     W12D5       Fine     11:37:02
..      ...        ...         ....

我该如何去做呢?

python pandas formatting row dataframe
4个回答
15
投票

最新版本(截至 2018 年 8 月)如下所示:

df = df.sort_values(by=['IDName', 'Time'])
df.drop_duplicates(subset=['IDName'], keep='last')

以防万一有人遇到这个问题并努力让它工作


12
投票

如果“df”是您的数据框,“IDName”是列,那么您可以尝试:

首先排序:

df = df.sort(columns=["IDName", "Time"])

然后删除重复项:

  df.drop_duplicates(subset=["IDName"], keep="last")

您可以在这里阅读更多内容: http://pandas.pydata.org/pandas-docs/stable/ generated/pandas.DataFrame.drop_duplicates.html


4
投票

又快又脏,但应该可以完成工作!

import pandas as pd
import numpy as np

# load your data

data['Time'] = pd.to_datetime(data['Time'])

list_of_indexes = [np.argmin(g['Time']) for l, g in data.groupby('ID Name')]
data.ix[list_of_indexes]

1
投票

这应该可以达到你想要的效果。我通常使用CSV格式来加载数据。

from pandas import *
import numpy as np

# load your data

df = read_cv('data.csv')
df['Time'] = to_datetime(df['Time'])

# remove duplicate

df = df.groupby('IDName', group_keys=False).apply(lambda x: x.ix[np.argmax(x['Time'])])

此链接可能对您也有帮助:删除重复项

© www.soinside.com 2019 - 2024. All rights reserved.