【问题标题】:Python Pandas - read_csv makes duplicates to NaNPython Pandas - read_csv 复制到 NaN
【发布时间】:2016-12-13 12:34:35
【问题描述】:

我目前在 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 也会删除第一个变量中的所有重复项。如何阻止 Pandas 这样做?

这是一段代码:

bla2 = bla

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

【问题讨论】:

  • 可以贴几行原始csv文件吗?
  • 重复是什么意思?
  • 如果不查看您的 CSV 文件,很难提供帮助。像@AlbertoGarcia-Raboso 所说的那样发布你的 csv 文件的头部
  • 如果那是你的输入文件,你为什么使用sep=','
  • 我无法重现该问题。

标签: python-2.7 pandas


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

或者你从bla.drop_duplicates的结果创建bla2

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

【讨论】:

  • 是的,因为drop_duplicates() 制作了帧的深层副本。 OP 中的损坏代码与 CSV 加载无关,仅仅是因为 OP 误解了 Python 的引用语义。
  • @JohnZwinck 我知道,我希望人们会尝试运行他们发布的代码以及他们的数据并包含所有相关的内容,这让我难以置信,当他们试图解释时,这并没有向人们注册怎么了
  • 嗨,感谢您的意见。不幸的是,我无法发布整个代码。但是删除第二行不会改变第一个变量的输出。我猜bla2 = bla 不是在 pandas 中创建具有相同内容的第二个变量的正确方法,对吧?
  • 对不起,你告诉我bla2 = bla2.drop_duplicates(subset='order_id') 不起作用?
  • 发布问题时供将来参考,包括原始数据、代码和所需的输出,代码必须可运行并重现问题,如果您不这样做会浪费很多人的时间,包括您的时间。您应该考虑如果您在所有编辑之前看到自己的问题并且未能重现问题,您会怎么想
猜你喜欢
  • 2020-03-26
  • 2015-02-17
  • 2020-02-02
  • 1970-01-01
  • 2019-03-17
  • 2014-11-07
  • 1970-01-01
  • 2019-12-27
  • 2020-02-19
相关资源
最近更新 更多