我有以下问题。在我的pandas数据框中,我有几个(无意中)重复的记录(特别是其中四个),我用drop_duplicates(take_last = True)
删除了它们。现在,在其中一个列中,我有一些字符串,我一直试图使用unique_vals, int_representation = np.unique(df.x, return_inverse = True)
映射整数值,但我发现由于某种原因我原始列中唯一字符串的数量,以及唯一整数的数量int_representation
中的值不同,这没有任何意义。
所以,我现在正在浏览原始数据框,试图理解其原因,我发现突然间我在访问数据框的索引时遇到错误,其中一个丢弃的重复项找到了。这真的很奇怪,比方说,df.xs(10)
有效,df.xs(11)
没有,df.xs(12)
再次有效。对于与已删除的记录相对应的索引,这恰好发生了四次。我还检查过,当我不掉线时,问题就消失了。
我怀疑这就是np.unique与其结果混淆的原因。它有意义吗?如何解决这个问题呢?任何帮助将不胜感激。
这是我正在使用的那种代码:
df_mwe = pd.DataFrame( {'one': [1,2,2,3,4,5], 'two': ['a','b','c','d','d','d']} )
df_mwe
one two
0 1 a
1 2 b
2 2 c
3 3 d
4 4 d
5 5 d
unique_vals, keys = np.unique( df_mwe['two'], return_inverse = True )
正如预期的那样,和keys
会返回array([0, 1, 2, 3, 3, 3])
。现在,让我们从第一列中删除重复项:
df_mwe = df_mwe.drop_duplicates(cols='one', take_last = True)
df_mwe
one two
0 1 a
2 2 c
3 3 d
4 4 d
5 5 d
和
unique_vals, keys = np.unique( df_mwe['two'], return_inverse = True )
产生keys
等于array([0, 1, 2, 3, 3])
,这是错误的,我怀疑它与框架1
现在在框架中缺失的事实有关。
编辑: 杰夫在下面的答案旁边,添加了这样一句话:
df_mwe.index = range(0,np.size(df_mwe['one']))
删除重复项后,也可以完成这项任务。
答案 0 :(得分:1)
使用其.values
属性传递系列。将一个系列传递给一个numpy函数应该与传递实际的底层数组相同(这是.values
给你的)。但由于np.unique
是不透明的,它可能会做一些不明显的事情。
In [169]: x = df_mwe.drop_duplicates(cols='one', take_last = True)
In [170]: x
Out[170]:
one two
0 1 a
2 2 c
3 3 d
4 4 d
5 5 d
In [171]: np.unique(x['two'],return_inverse=True)
Out[171]:
(two
0 a
1 NaN
2 c
3 d
Name: two, dtype: object,
array([0, 1, 2, 3, 3]))
In [172]: np.unique(x['two'].values,return_inverse=True)
Out[172]: (array(['a', 'c', 'd'], dtype=object), array([0, 1, 2, 2, 2]))
这是大熊猫这样做的方式,FYI(第一个返回值是索引器, 第二个是提供的缺失标记清单)
In [182]: Index(x['two'].unique()).get_indexer_non_unique(x['two'])
Out[182]: (Int64Index([0, 1, 2, 2, 2], dtype=int64), array([], dtype=int64))