Oni*_*olo 4 python numpy pandas
我有删除重复项的问题.我的程序基于一个生成元组(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 ]]
Run Code Online (Sandbox Code Playgroud)
数组的长度是22.现在,我需要删除重复的条目(参见**).所以我用过:
def urows(array):
df = pandas.DataFrame(array)
df.drop_duplicates(take_last=True)
return df.drop_duplicates(take_last=True).values
Run Code Online (Sandbox Code Playgroud)
很棒,但我仍然得到:
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**
Run Code Online (Sandbox Code Playgroud)
因此删除重复项不会删除任何内容.我测试看看节点实际上是否相同,我得到:
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.]
Run Code Online (Sandbox Code Playgroud)
为什么不工作?如何删除那些重复的值???
还有一个问题....
假设两个值"几乎"相等(比如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
Run Code Online (Sandbox Code Playgroud)
所以它实际上被移除了,你的问题是数组并不完全相等(尽管它们的差异为0表示显示).
一种解决方法是将数据四舍五入到许多小数位,适用于类似的东西df.apply(np.round, args=[4]),然后删除重复项.如果你想保留原始数据但删除重复的行直到舍入,你可以使用类似的东西
df = df.ix[~df.apply(np.round, args=[4]).duplicated()]
Run Code Online (Sandbox Code Playgroud)
这是一个非常笨拙的方式来做你所要求的设置几乎相等的值实际上是相等的:
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)
Run Code Online (Sandbox Code Playgroud)
这会重新排序数据框,但.sort()如果需要,您可以调用以原始顺序将其恢复.
说明:第一行用于groupby按舍入值对数据框进行分组.不幸的是,如果你给groupby提供一个函数,它会将它应用于标签而不是行(所以你可能会这样做df.groupby(lambda k: np.round(df.ix[k], 4)),但这也很糟糕).
第二行使用applygroupby上的方法g用新数据帧替换近似重复行的数据帧g.apply(lambda row: g.irow(0), axis=1).它使用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
Run Code Online (Sandbox Code Playgroud)
where groupby已将舍入值作为索引插入.reset_index然后该线丢弃这些列.
希望能比我更了解熊猫的人会匆匆而过,并展示如何做得更好.
| 归档时间: |
|
| 查看次数: |
6635 次 |
| 最近记录: |