Python Pandas - read_csv与NaN重复

时间:2016-08-07 18:32:13

标签: python-2.7 pandas

我目前正在使用Dataframe上的pandas,在读取csv文件并将特定列转换为str之后,pandas似乎将此行的所有重复项转换为NaN。

bla = pd.read_csv(bla_path, sep=',',converters={'order_id':str})

它给了我这个结果:

 internal_conversion_id        order_id  conversion_target_id  \
0                    85            9222                 67   
1                    20            9224                 65   
2                    20             NaN                 65   
3                    20             NaN                 65   
4                    33            9233                 67   
5                    33             NaN                 67 

有人知道我错过了什么吗?原始文件确实包含重复项。

编辑:我刚检查过 - 当我不使用converters时,也会发生这种情况。

编辑2:这里有来自原始csv的一些行:

internal_conversion_id,order_id,conversion_target_id,product_nr
85,9222,67,1
20,9224,65,1
20,9224,65,2
20,9224,65,3
33,9223,67,1
33,9223,67,2

EDIT3:

好吧,我想我找到了消息来源。

在代码中的某个时刻,我想创建一个第二个变量,其内容与第一个相同,但没有重复。 Pandas也会删除第一个变量中的所有重复项。我怎么能阻止熊猫呢?

这是一段代码:

bla2 = bla

bla2['order_id'] = bla2['order_id'].drop_duplicates()
bla2 = bla2[pd.notnull(bla2['order_id'])]

1 个答案:

答案 0 :(得分:1)

如果你想删除重复项,你可以这样做:

bla2 = bla2.drop_duplicates(subset='order_id')

您所做的是通过执行以下操作覆盖该列的drop_duplicates返回结果:

bla2['order_id'] = bla2['order_id'].drop_duplicates()

那时你引入了NaN,其中值是重复的:

In [3]:
df['order_id'].drop_duplicates()

Out[3]:
0    9222
1    9224
4    9223
Name: order_id, dtype: int64

In [4]:
df['order_id'] = df['order_id'].drop_duplicates()
df

Out[4]:
   internal_conversion_id  order_id  conversion_target_id  product_nr
0                      85      9222                    67           1
1                      20      9224                    65           1
2                      20       NaN                    65           2
3                      20       NaN                    65           3
4                      33      9223                    67           1
5                      33       NaN                    67           2

但是,您的最后一行代码应该有效:

In [5]:
df = df[pd.notnull(df['order_id'])]
df

Out[5]:
   internal_conversion_id  order_id  conversion_target_id  product_nr
0                      85      9222                    67           1
1                      20      9224                    65           1
4                      33      9223                    67           1

所以我不知道你是否感到困惑

修改

如果你想制作副本,那就复制一下:

bla2 = bla.copy()

然后你可以用bla2做任何你想做的事情,它不会影响bla

或者您从bla2

的结果中创建bla.drop_duplicates
bla2 = bla.drop_duplicates(subset='order_id')