【问题标题】:Remove duplicate values in pandas but after some manipulation [closed]删除熊猫中的重复值,但经过一些操作[关闭]
【发布时间】:2021-04-15 23:15:26
【问题描述】:

我有一个这样的熊猫数据集

{col_A  col_B   col_Z
Sam      time1    time2
Sam      time3  time4
R        time1  time2
H        time1  time2
H        time5  time6}

我想要这样的输出

{col_A  col_B   col_Z
Sam      time1  time4
R        time1  time2
H        time1  time6}

我尝试使用删除重复,但到目前为止没有用。基本假设是time1 H也一样,但是我们不需要对col_B和col_Z进行比较。

【问题讨论】:

  • 能否请您发布您拥有的当前代码?
  • df.drop_duplicates(['col_A'],keep= 'last') 这完全删除了第一行,但是,我想保留第一行的 col_B 和第二行的 col_Z。

标签: python pandas dataframe duplicates pandas-groupby


【解决方案1】:

我有两种方法来解决这个问题:

第一个涉及简单的循环,我在col_B 中获得time 值和col_Z 中的time 值:

# Import packages
import numpy as np
import pandas as pd

# Set up variables for new columns
names = np.unique(df['col_A'])
firstTimes = []
lastTimes = []

# Loop through name? in col_A of df
for name in names:
    nameData = df.loc[df['col_A'] == name]
    firstTime = nameData.to_numpy()[0,1]
    lastTime = nameData.to_numpy()[-1,2]
    
    firstTimes.append(firstTime)
    lastTimes.append(lastTime)

# Create the dataframe
dNew = {'col_A': names, 'col_B': firstTimes, 'col_Z': lastTimes}
filteredDF = pd.DataFrame(data = dNew)

df 是您的示例 Pandas DataFrame,filteredDF 是新过滤的 DataFrame(如下所示):

    col_A   col_B   col_Z
0   H       time1   time6
1   R       time1   time2
2   Sam     time1   time4


第二个是假设col_Bcol_Z 中的值是DatetimeTimestamp 值。我利用 Pandas 的 groupby() 函数对 col_A 中的每个值进行分组,然后将 col_B 的值聚合为最小值,将 col_Z 的值聚合为最大值:

dfNew = df.groupby('col_A').agg({'col_B':'min', 'col_Z':'max'}).reset_index()

例如,如果df 看起来像这样:

    col_A    col_B                  col_Z
0   Sam      1970-01-01 00:00:10    1970-01-01 00:00:20
1   Sam      1970-01-01 00:00:30    1970-01-01 00:00:40
2   R        1970-01-01 00:00:10    1970-01-01 00:00:20
3   H        1970-01-01 00:00:10    1970-01-01 00:00:20
4   H        1970-01-01 00:00:50    1970-01-01 00:01:00

那么dfNew 将如下所示(注意:col_A 按字母顺序排序):

    col_A   col_B                   col_Z
0   H       1970-01-01 00:00:10     1970-01-01 00:01:00
1   R       1970-01-01 00:00:10     1970-01-01 00:00:20
2   Sam     1970-01-01 00:00:10     1970-01-01 00:00:40

显然,如您所见,如果您使用可聚合的适当数据类型,方法 2 会简单得多!

【讨论】:

  • 第二种方法对我很有效。我还有其他列,不需要相同,所以,我将它们保留在 groupby 部分。谢谢您的帮助。你为我节省了无数个小时。
  • @TechKnow 很高兴我能帮上忙!
猜你喜欢
  • 2020-01-19
  • 2019-12-08
  • 2021-07-01
  • 2016-01-30
  • 2021-12-18
  • 2019-12-14
  • 2013-10-28
  • 1970-01-01
  • 2021-08-31
相关资源
最近更新 更多