我有一个简单的数据框。我正在尝试根据两列删除重复的行。
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输出确实反映了转换。
答案 0 :(得分:3)
就drop_duplicates()
而言,您所看到的是一个已知错误,应通过合并#11403在0.17.1
中修复。
对于astype
,value_count()
将输出一个dtype为int64
的系列。对于永久性更改,您需要重新分配,这意味着b=b.astype('str')