pandas中如何对指定列做fillna
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas中如何对指定列做fillna相关的知识,希望对你有一定的参考价值。
我在python中使用pandas模块返回了一个dataframe,其中有列是NA,分别是‘code’列和‘date’列,我想对这两列分别fillna成code与date,请问怎么代码。在网上查的资料都是 dataframe().fillna(), 没有两列分别替换成不同值的例子。
dataframe.fillna('code':'code', 'date':'date'),第一个code和date分别表示列,后面的表示在该列填充的内容 参考技术A df.fillna(2:0.5,3:1)表示列标签为2的这列中的NA用0.5填充,列标签为3的这列中的NA用1填充。 参考技术B dataframe()['code'].fillna('code')dataframe()['date'].fillna('date')
请看《利用Python进行数据分析》。
pandas.DataFrame.fillna - TypeError:只有整数标量数组可以转换为标量索引
【中文标题】pandas.DataFrame.fillna - TypeError:只有整数标量数组可以转换为标量索引【英文标题】:pandas.DataFrame.fillna - TypeError: only integer scalar arrays can be converted to a scalar index 【发布时间】:2021-01-27 21:36:03 【问题描述】:我正在尝试从熊猫官方文档中执行this。 pandas.DataFrame.fillna 所以基本上用 1 的值填充 df 数据框的“myc”列中的 NaN 值。
数据数据框
df
myc B C D
0 NaN 2.0 NaN 0
1 0.2 4.0 NaN 1
2 NaN NaN NaN 5
3 NaN 3.0 NaN 4
代码 1
values = 'myc': 1
df.fillna(value=values)
结果目标 1
myc B C D
0 1.0 2.0 NaN 0
1 0.2 4.0 NaN 1
2 1.0 NaN NaN 5
3 1.0 3.0 NaN 4
错误消息 1
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-21-6a9e5a691bca> in <module>
1 values = 'myc': 1
----> 2 df.fillna(value=values)
~/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py in fillna(self, value, method, axis, inplace, limit, downcast)
4315 downcast=None,
4316 ) -> Optional["DataFrame"]:
-> 4317 return super().fillna(
4318 value=value,
4319 method=method,
~/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in fillna(self, value, method, axis, inplace, limit, downcast)
6071 if k not in result:
6072 continue
-> 6073 obj = result[k]
6074 obj.fillna(v, limit=limit, inplace=True, downcast=downcast)
6075 return result if not inplace else None
~/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py in __getitem__(self, key)
2876 if self.columns.nlevels > 1:
2877 return self._getitem_multilevel(key)
-> 2878 return self._get_item_cache(key)
2879
2880 # Do we have a slicer (on rows)?
~/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in _get_item_cache(self, item)
3539
3540 loc = self.columns.get_loc(item)
-> 3541 values = self._mgr.iget(loc)
3542 res = self._box_col_values(values, loc)
3543
~/anaconda3/lib/python3.8/site-packages/pandas/core/internals/managers.py in iget(self, i)
986 Return the data as a SingleBlockManager.
987 """
--> 988 block = self.blocks[self.blknos[i]]
989 values = block.iget(self.blklocs[i])
990
TypeError: only integer scalar arrays can be converted to a scalar index
CODE 2 我后来也尝试列出 any_feature 列的独特功能
df['any_feature'].unique()
错误 2
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-39-934988075beb> in <module>
----> 1 df['any_feature'].unique()
~/anaconda3/lib/python3.8/site-packages/pandas/core/frame.py in __getitem__(self, key)
2876 if self.columns.nlevels > 1:
2877 return self._getitem_multilevel(key)
-> 2878 return self._get_item_cache(key)
2879
2880 # Do we have a slicer (on rows)?
~/anaconda3/lib/python3.8/site-packages/pandas/core/generic.py in _get_item_cache(self, item)
3539
3540 loc = self.columns.get_loc(item)
-> 3541 values = self._mgr.iget(loc)
3542 res = self._box_col_values(values, loc)
3543
~/anaconda3/lib/python3.8/site-packages/pandas/core/internals/managers.py in iget(self, i)
986 Return the data as a SingleBlockManager.
987 """
--> 988 block = self.blocks[self.blknos[i]]
989 values = block.iget(self.blklocs[i])
990
TypeError: only integer scalar arrays can be converted to a scalar index
尝试过的解决方案
不是字典 - Pandas: Getting "TypeError: only integer scalar arrays can be converted to a scalar index" while trying to merge data frames 不是字典 - Only integer scalar arrays can be converted to a scalar index how to resolve 未回答 - How to resolve Python TypeError: "only integer scalar arrays can be converted to a scalar index" 不是字典 - TypeError: only integer scalar arrays can be converted to a scalar index with 1D numpy indices array 不是字典 - numpy array TypeError: only integer scalar arrays can be converted to a scalar index 不是字典 - TypeError: only integer scalar arrays can be converted to a scalar index when use Pandas Fillna 我不想转换它 - How to convert index of a pandas dataframe into a column? 我尝试运行以下代码来测试该对象是否为数据框,并且它说是真的,所以它是 - https://***.com/a/14809149/10270590 输入 isinstance(df, pd.DataFrame)
输出
True
【问题讨论】:
你的熊猫版是什么?你的代码在我这边运行良好 我用 pandas 1.1.1 和 1.1.3 都检查过,pandas 没有问题。我认为您的 DF 某处有问题。也许是 numpy 版本? 你能分享更多代码行吗?还是数据集? 你能在某处分享你好 .csv 吗?如果它在另一台计算机上工作,问题将是您安装的一些软件包。df['myc'] = df['myc'].fillna(1)
怎么样?
【参考方案1】:
您的代码中发生了一些奇怪的事情,因为:
NaN 的替换应该仅在 myc 列中发生, 但您的结果也包含替换值,例如在 C column 和 NaN 被替换为 2。只运行以下代码(与您的代码分开):
import pandas as pd
import io
txt = '''myc,B,C,D
NaN,2.0,NaN,0
3.0,4.0,NaN,1
NaN,NaN,NaN,5
NaN,3.0,NaN,4'''
df = pd.read_csv(io.StringIO(txt))
result = df.fillna(value='myc': 1)
结果应该是:
myc B C D
0 1.0 2.0 NaN 0
1 3.0 4.0 NaN 1
2 1.0 NaN NaN 5
3 1.0 3.0 NaN 4
如果你得到相同的结果,那么显然有 您的代码有问题,但在其他地方 (在您提供的那段代码之外)。
另一个需要改变的细节是 values 是一个属性 Pandas,你不应该使用同名的变量。
【讨论】:
我已经更正了,对不起,我在这里输入了我的 DF,所以我随机把值放在那里。【参考方案2】:简单的解决方案
将数据帧导出到 csv:df.to_csv(r'somefilename.csv', index=False)
将 saem 数据加载回 DataFrame: df1 = pd.read_csv("r'somefilename.csv")
【讨论】:
以上是关于pandas中如何对指定列做fillna的主要内容,如果未能解决你的问题,请参考以下文章
IPython Notebook 和 Pandas 自动完成
pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用size函数计算分组数据中每个分组样本的个数