python - fillna 与 nametuple 或任何其他类 pandas

标签 python pandas namedtuple

有没有办法在Python中用namedtuple来填充?

我收到此TypeError:

from collections import namedtuple
import pandas as pd
import numpy as np

df = pd.DataFrame([0, 0, 0, 0, np.nan, 0, 0, 0])

nametup = namedtuple('mynp', ['arg1', 'arg2'])
q = nametup(None, None)
df.fillna(q)

Traceback (most recent call last):
  File "C:\Anaconda2\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-25-363ec560dd77>", line 9, in <module>
    df.fillna(q)
  File "C:\Anaconda2\lib\site-packages\pandas\core\frame.py", line 2762, in fillna
    downcast=downcast, **kwargs)
  File "C:\Anaconda2\lib\site-packages\pandas\core\generic.py", line 3101, in fillna
    'you passed a "{0}"'.format(type(value).__name__))
TypeError: "value" parameter must be a scalar or dict, but you passed a "mynp"

也尝试过这个:

df.replace(np.nan, q)
Traceback (most recent call last):
  File "C:\Anaconda2\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-31-6f8a86f11bbb>", line 1, in <module>
    df.replace(np.nan, q)
  File "C:\Anaconda2\lib\site-packages\pandas\core\generic.py", line 3440, in replace
    raise TypeError(msg)  # pragma: no cover
TypeError: Invalid "to_replace" type: 'float'

有什么解决办法吗?谢谢!

最佳答案

这并不容易,但需要通过对象创建Series,然后替换NaN:

nametup = namedtuple('mynp', ['arg1', 'arg2'])
q = nametup(None, None)

s = pd.Series([q]*len(df.index))
print (s)
0    (None, None)
1    (None, None)
2    (None, None)
3    (None, None)
4    (None, None)
5    (None, None)
6    (None, None)
7    (None, None)
dtype: object

解决方案 mask :

df[0] = df[0].mask(df[0].isnull(), s)
print (df)
              0
0             0
1             0
2             0
3             0
4  (None, None)
5             0
6             0
7             0

另一个解决方案 combine_firstfillna系列s:

df[0] = df[0].combine_first(s)
#similar solution
#df[0] = df[0].fillna(s)
print (df)
              0
0             0
1             0
2             0
3             0
4  (None, None)
5             0
6             0
7             0

关于python - fillna 与 nametuple 或任何其他类 pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43054853/

相关文章:

python - 无法在 Windows 10 上安装 dlib

python - 将给定文本更改为列表列表

python - 如何根据 python pandas 中的 1 个以上的独特类别过滤数据

python - scrapy 如何在 div 类中获取第二个 <a href> ?

python - Pandas 滚动并忽略计数中包含 NaN 的行

python - 重复数据帧并增加时间戳

python - 对 namedtuple 类进行自定义排序

javascript - 如何在javascript中实现python的namedtuple

python - namedtuple 的第一个参数是做什么用的?

python - 如何找到两个目录之间的相对路径?