【问题标题】:How to make the conversion NaN >> [''] to all the elements of a Pandas Dataframe?如何将 NaN >> [''] 转换为 Pandas Dataframe 的所有元素?
【发布时间】:2018-11-30 15:53:46
【问题描述】:
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': [[1, 2, 3, 4], [4, 5, 6, 7, 8], [7, 6, 4], np.nan, [1, 2]],
    'B': [[1, 2, 3, 4], [4, 5, 6, 7, 8], [3, 7, 9], np.nan, [4, 5]],
    'E': [np.nan, np.nan, np.nan, np.nan, np.nan],
    'F': [[2, 2], [4, 4], np.nan, [78, 90], np.nan]
})

# First try
# ERROR: Cannot do inplace boolean setting on mixed-types with a non np.nan value
# df[df.isnull()] = df[df.isnull()].applymap(lambda x: [''])

# Second try
# ERROR: Invalid "to_replace" type: 'float'
# df.replace(to_replace=np.nan, value=[''], inplace=True)

# Third try
# RESULT: The column 'E' dissapears and the rest of NaN values are converted to None
# stack = df.stack()
# stack[stack.isnull()] = ['']    # or stack[stack == np.nan] = ['']    
# stack.unstack()

# Fourth try
# ERROR: "value" parameter must be a scalar or dict, but you passed a "list"
# df.fillna([''])

这是我的预期结果:

df = pd.DataFrame({
    'A': [[1, 2, 3, 4], [4, 5, 6, 7, 8], [7, 6, 4], [''], [1, 2]],
    'B': [[1, 2, 3, 4], [4, 5, 6, 7, 8], [3, 7, 9], [''], [4, 5]],
    'E': [[''], [''], [''], [''], ['']],
    'F': [[2, 2], [4, 4], [''], [78, 90], ['']]
})

我已经尝试了示例中显示的所有方法,但没有结果。如何做到这一点?

注意:我想指出,替换是一个只有一个元素的列表,一个空字符串。也可以是[np.nan]

【问题讨论】:

  • 旁注:您确定要在F 中输入一个空字符串,这似乎是一个数字列吗?添加字符串会将整个系列变成object dtype,既昂贵又低效。
  • @jpp 实际上都是列表,我想用一个元素的列表替换 NaN 值,一个空字符串。我已经更新了我的问题。看一下,谢谢
  • 这让我的观点更加重要:)

标签: python python-3.x pandas dataframe nan


【解决方案1】:

更新:

In [136]: df.applymap(lambda x: x if isinstance(x, list) else [])
Out[136]:
                 A                B   E         F
0     [1, 2, 3, 4]     [1, 2, 3, 4]  []    [2, 2]
1  [4, 5, 6, 7, 8]  [4, 5, 6, 7, 8]  []    [4, 4]
2        [7, 6, 4]        [3, 7, 9]  []        []
3               []               []  []  [78, 90]
4           [1, 2]           [4, 5]  []        []

或:

In [152]: df = df.applymap(lambda x: x if isinstance(x, list) else [np.nan])

In [153]: df
Out[153]:
                 A                B      E         F
0     [1, 2, 3, 4]     [1, 2, 3, 4]  [nan]    [2, 2]
1  [4, 5, 6, 7, 8]  [4, 5, 6, 7, 8]  [nan]    [4, 4]
2        [7, 6, 4]        [3, 7, 9]  [nan]     [nan]
3            [nan]            [nan]  [nan]  [78, 90]
4           [1, 2]           [4, 5]  [nan]     [nan]

注意: 请注意@jpp's comment - 在单元格中存储非标量值会破坏 90% 的 Pandas/Numpy 魔法,因为大多数快速内部矢量化方法都希望在单元格中存储标量值 - 它们将无法工作或无法按预期工作。


数据集的答案之前问题已更新:

你可以做到的:

In [120]: df = df.fillna('')

In [121]: df
Out[121]:
       A      B         C         D E   F
0   zero    one  0.226100  1.764036     2
1    one    one -1.672476 -0.867188     2
2    two         0.671258  0.125589     4
3  three  three  1.135731  0.080577     4
4   four    two -1.711692  0.735028    67
5           two  0.608488  1.012977
6    six    one -1.233979 -0.623781    78
7  seven  three  0.256893 -0.546639    90

但所有包含至少一个NaN 值的列都将转换为字符串,因为空字符串'' 将始终有一个字符串(object)dtype

In [122]: df.dtypes
Out[122]:
A     object
B     object
C    float64
D    float64
E     object
F     object
dtype: object

【讨论】:

  • 嗯实际上我要替换的是一个包含一个元素的列表,而这个元素是一个空字符串:['']
  • @ChesuCR,你能在你的问题中发布你想要的数据集吗?
  • 好的,我会尽量说得更清楚。我稍后会更新我的问题
  • 我已经更新了我的问题,请看一下,谢谢
  • @ChesuCR,我已经更新了我的答案。基本上它将任何非列表单元格转换为空列表。请让我知道您是否可能在单元格中有标量值,以及在这种情况下如何处理它们?
猜你喜欢
  • 2020-01-23
  • 1970-01-01
  • 2018-05-19
  • 2023-03-31
  • 2019-09-25
  • 2014-01-05
  • 2017-09-20
  • 2013-05-25
  • 2022-09-29
相关资源
最近更新 更多