我有删除重复项的问题.我的程序基于一个生成元组(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行删除这些列.
希望能比我更了解熊猫的人会匆匆而过,并展示如何做得更好.