【问题标题】:python pandas accessing index after dropping a recordpython pandas在删除记录后访问索引
【发布时间】:2013-06-29 20:28:58
【问题描述】:

我有以下问题。在我的 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 )

yields keys 等于 array([0, 1, 2, 3, 3]),这是错误的,我怀疑这与索引 1 现在在框架中丢失有关。

编辑: 杰夫的回答放在一边,添加这样的行:

df_mwe.index = range(0,np.size(df_mwe['one']))

删除重复项后,也可以完成这项工作。

【问题讨论】:

  • 你能把你原来的框架和代码放上来复制吗?
  • 在做之前,有没有可能是我丢帧后没有手动重新索引?
  • 显示您的代码将有助于诊断问题。当您不期望时,您可能正在处理副本或就地执行操作
  • @Jeff,我编辑了我的问题。

标签: python pandas dataframe


【解决方案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]))

这是熊猫的做法,仅供参考(第一个返回值是索引器, 第二个是提供的缺失指标列表)

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))

【讨论】:

  • 你在用np.unique做什么?你的最终目标是什么?
  • 只是想将这些字符串映射到整数(我正在计算文本的一些统计数据,并且我需要数字表示形式的单词),并且在这里暗示我在代码中调用的键是一种简单的方法,这实际上是正确的。
  • 作为您的解决方案的替代方案,将这一行 df_mwe.index = range(0,np.size(df_mwe['one'])) 添加到我原来的 mwe 中也可以完成这项工作。
  • 我添加了熊猫的方式来做你正在做的事情(这实际上是一个有趣的功能)
  • 实际上,事实证明,对于我的大型数据框,np.unique 仍然如您所建议的那样,即使在使用values 传递参数时也是如此。我真的不明白为什么,但只有在明确重新索引我用range 写的内容之后,它才开始正常工作。
猜你喜欢
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 2020-04-30
  • 2015-04-26
  • 2021-11-24
  • 1970-01-01
  • 2021-04-15
相关资源
最近更新 更多