pandas drop_duplicates方法不一致的结果

时间:2015-11-13 20:41:34

标签: python pandas

我有一个简单的数据框。我正在尝试根据两列删除重复的行。

import pandas as pd
b = pd.read_json('{"columns":["a","b"],"data":[[3110,75],[3110,75],[3115,75],[3120,75],[3123,75],[3129,75],[3134,75],[3137,75],[3129,75],[3110,29],[3115,29],[3120,29],[3123,29],[3129,29],[3134,29],[3137,29],[3129,29],[3110,62],[3115,62],[3120,62],[3123,62],[3129,62],[3134,62],[3137,62],[3129,62]]}', orient='split')

这会产生一个如下所示的数据框:

    a       b
0   3110    75
1   3110    75  <-- duplicate
2   3115    75
3   3120    75
4   3123    75
5   3129    75
6   3134    75
7   3137    75
8   3129    75  <-- duplicate
9   3110    29
10  3115    29
11  3120    29
12  3123    29
13  3129    29
14  3134    29
15  3137    29
16  3129    29  <-- duplicate
17  3110    62
18  3115    62
19  3120    62
20  3123    62
21  3129    62
22  3134    62
23  3137    62
24  3129    62  <-- duplicate

如果我只使用b.drop_duplicates()我得到(不正确):

b.drop_duplicates()['b'].value_counts()
29    7
75    7
62    6
Name: b, dtype: int64

但如果我使用b.astype(str).drop_duplicates()['b'].value_counts()将类型更改为字符串,我会得到(正确):

b.astype(str).drop_duplicates()['b'].value_counts()
62    7
75    7
29    7
Name: b, dtype: int64

为什么在最简单的drop_duplicates应用程序中缺少第20行?另外,为什么dtype int64甚至在将其转换为str作为过程的一部分之后呢?

incorrect               correct
      a     b               a       b
0   3110    75          0   3110    75
2   3115    75          2   3115    75
3   3120    75          3   3120    75
4   3123    75          4   3123    75
5   3129    75          5   3129    75
6   3134    75          6   3134    75
7   3137    75          7   3137    75
9   3110    29          9   3110    29
10  3115    29          10  3115    29
11  3120    29          11  3120    29
12  3123    29          12  3123    29
13  3129    29          13  3129    29
14  3134    29          14  3134    29
15  3137    29          15  3137    29
17  3110    62          17  3110    62
18  3115    62          18  3115    62
19  3120    62          19  3120    62
21  3129    62          20  3123    62
22  3134    62          21  3129    62
23  3137    62          22  3134    62
                        23  3137    62

pd.__version__
'0.17.0'

dtypes问题似乎与value_counts()方法中自动发生的事情有关。原始DataFrame输出确实反映了转换。

1 个答案:

答案 0 :(得分:3)

drop_duplicates()而言,您所看到的是一个已知错误,应通过合并#114030.17.1中修复。

对于astypevalue_count()将输出一个dtype为int64的系列。对于永久性更改,您需要重新分配,这意味着b=b.astype('str')