python dataframe去除重复项_删除Python Pandas DataFrame中的重复项不会删除重复项

在处理数据时,遇到一个删除重复项的问题。使用`pandas.DataFrame.drop_duplicates()`函数,但发现无法有效删除重复项。经过检查,发现数据在浮点数精度上存在差异,导致无法识别为重复。解决方案是先四舍五入数据,再应用`drop_duplicates()`,或者通过分组和应用`irow(0)`来替换近似的重复值。
摘要由CSDN通过智能技术生成

我有删除重复项的问题.我的程序基于一个生成元组(x,y)的循环,然后将其用作图中的节点.节点的最终数组/矩阵是:

[[ 1. 1. ]

[ 1.12273268 1.15322175]

[..........etc..........]

[ 0.94120695 0.77802849]

**[ 0.84301344 0.91660517]**

[ 0.93096269 1.21383287]

**[ 0.84301344 0.91660517]**

[ 0.75506418 1.0798641 ]]

数组的长度是22.现在,我需要删除重复的条目(参见**).所以我用过:

def urows(array):

df = pandas.DataFrame(array)

df.drop_duplicates(take_last=True)

return df.drop_duplicates(take_last=True).values

很棒,但我仍然得到:

0 1

0 1.000000 1.000000

....... etc...........

17 1.039400 1.030320

18 0.941207 0.778028

**19 0.843013 0.916605**

20 0.930963 1.213833

**21 0.843013 0.916605**

因此删除重复项不会删除任何内容.我测试看看节点实际上是否相同,我得到:

print urows(total_nodes)[19,:]

---> [ 0.84301344 0.91660517]

print urows(total_nodes)[21,:]

---> [ 0.84301344 0.91660517]

print urows(total_nodes)[12,:] - urows(total_nodes)[13,:]

---> [ 0. 0.]

为什么不工作?如何删除那些重复的值???

还有一个问题….

假设两个值“几乎”相等(比如x1和x2),有没有办法以它们相等的方式替换它们?我想要的是用x1替换x2,如果它们“几乎”相等.

解决方法:

如果我复制粘贴您的数据,我得到:

>>> df

0 1

0 1.000000 1.000000

1 1.122733 1.153222

2 0.941207 0.778028

3 0.843013 0.916605

4 0.930963 1.213833

5 0.843013 0.916605

6 0.755064 1.079864

>>> df.drop_duplicates()

0 1

0 1.000000 1.000000

1 1.122733 1.153222

2 0.941207 0.778028

3 0.843013 0.916605

4 0.930963 1.213833

6 0.755064 1.079864

所以它实际上被移除了,你的问题是数组并不完全相等(尽管它们的差异为0以显示).

一种解决方法是将数据四舍五入到许多小数位,例如df.apply(np.round,args = [4]),然后删除重复项.如果你想保留原始数据但删除重复的行直到舍入,你可以使用类似的东西

df = df.ix[~df.apply(np.round, args=[4]).duplicated()]

这是一个非常笨拙的方式来做你所要求的设置几乎相等的值实际上是相等的:

grouped = df.groupby([df[i].round(4) for i in df.columns])

subbed = grouped.apply(lambda g: g.apply(lambda row: g.irow(0), axis=1))

subbed.drop_index(level=list(df.columns), drop=True, inplace=True)

这会重新排序数据帧,但是如果需要,可以调用.sort()以原始顺序将它们恢复.

说明:第一行使用groupby按舍入值对数据框进行分组.不幸的是,如果你给groupby一个函数它将它应用于标签而不是行(所以你可以做df.groupby(lambda k:np.round(df.ix [k],4)),但是很糟糕太).

第二行使用groupby上的apply方法用新数据帧g.apply(lambda row:g.irow(0),axis = 1)替换近似重复行g的数据帧.它在数据帧上使用apply方法将每一行替换为组的第一行.

结果看起来像

0 1

0 1

0.7551 1.0799 6 0.755064 1.079864

0.8430 0.9166 3 0.843013 0.916605

5 0.843013 0.916605

0.9310 1.2138 4 0.930963 1.213833

0.9412 0.7780 2 0.941207 0.778028

1.0000 1.0000 0 1.000000 1.000000

1.1227 1.1532 1 1.122733 1.153222

其中groupby已将舍入值作为索引插入.然后reset_index行删除这些列.

希望能比我更了解熊猫的人会匆匆而过,并展示如何做得更好.

标签:python,pandas,numpy

来源: https://codeday.me/bug/20190529/1178477.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值