【问题标题】:Homogenizing columns that mix NaNs and empty strings对混合了 NaN 和空字符串的列进行均质化
【发布时间】:2018-06-28 07:25:25
【问题描述】:

我将一个相对较大的 csv (~200Mb) 数据集导入到 pandas 中,其中一些列包含一个奇怪的“.”。字符串(实际上是一个空单元格)或 NaN。其他列包含 NaN 或空字符串。在第一种情况下,我想将奇怪的字符串转换为 NaN。在第二种情况下,我想将 NaN 转换为空字符串。我一直在尝试一些方法,但他们没有做我想要的。请注意,我不想使用 dropna 或任何影响其他行的东西。

例如

df['Col1'].replace(np.nan, '', regex=True)

在该列的某些行中包含 0。

举个例子,我想转换一下:

 Col1   Col2  Col
 ' .'   NaN    3 
 NaN   '  .'   1

  Col1 Col2 Col
  NaN  NaN  3
  NaN  NaN  1

并转换

 Col1 Col2 Col
 ""   NaN  3 
 NaN  5    1
 5    3    4

 Col1 Col2 Col
 ""   ""   3 
 ""   5    1
 5    3    4

感谢您的帮助

【问题讨论】:

  • 第一种情况很简单。但第二种情况……你为什么要这样做?
  • 有几个原因。例如,其中之一,我想从这些列中获取假人。 Pandas 将创建列 "" 和列 nan。
  • 不,pandas 会忽略 NaN。 OTOH,那些空字符串不会。你希望他们忽略还是不?
  • 我想让它们在整个列中保持一致。这些问题是原始 excel 文件生成方式的遗留问题,当我想使用这些列时,它确实会产生问题。
  • 例如,当我有这种异质性时,我在添加 Col1 和 Col2 的元素时遇到问题

标签: python pandas


【解决方案1】:

你可以试试下面的代码:-

df['Col1'] = df['Col1'].replace('.','').replace(' ','').fillna('')
df['Col2'] = df['Col2'].replace('.','').replace(' ','').fillna('')

我首先将'.' 和空格替换为default value,然后将所有nan 值也填充到default value。我希望这会有所帮助。

【讨论】:

  • 谢谢。我会试试的
  • @JuliannoSambatti 这可能有效,也可能无效。如果您有其他包含这些字符的字符串,您不想盲目替换任何内容。
  • @JuliannoSambatti 这也无法扩展。我可以想象在具有很多列的数据上表现不佳。您必须遍历每一列,每次进行 2 个 replace 调用和一个 fillna 调用。哇。
  • 太奇怪了。它在几个地方插入了一些“0”。
  • 我同意这个过程可能很慢,但考虑到str 类型,我们可能会达到我们的目的。 @JuliannoSambatti 这不会添加 0,而是 numpy,因此您可以先清理 str 类型的数据,然后根据需要转换为 floatint
【解决方案2】:

我认为最好选择一个单个值(NaN 或空字符串),然后将列值转换为那个值。

读取数据时,指定quotecharna_values 参数。

df = pd.read_excel('file.xls', quotechar="'", na_values=[''])

这应该消除空字符串,将它们转换为 NaN(处理第二种情况)。接下来,对于您的第一个情况,请使用带有正则表达式的replace -

df.replace('^\s*\.?\s*$', np.nan, regex=True)

   Col1  Col2  Col
0   NaN   NaN    3
1   NaN   NaN    1

表达式匹配带有空格的单元格和可选的'.'

【讨论】:

  • 谢谢,我认为数据复杂性会产生一些意想不到的行为。它确实取代了“.”。但是,当我应用你的代码时,一些整行(我有大约 100 列),显然是随机行,被设置为 0。
  • @JuliannoSambatti replace 可以做很多事情,但这不是其中之一。我需要看看导致这种情况的数据是什么样的,否则我无法回答你的问题。
  • 看来问题在于读取数据。我正在使用 jupyter notebook 进行测试。使用这个有什么问题吗?
  • @JuliannoSambatti 不,永远不会。这是一个奇怪的问题。
  • 没关系。在我更多地打扰你之前,让我做一些测试并尝试缩小问题的范围。谢谢您的帮助。我部分解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
相关资源
最近更新 更多