熊猫不会在地方填充()

Bea*_*tow 13 python pandas

我正在尝试在数据框中作为字符串/对象类型的4个特定列上填充"".我可以将这些列分配给一个新的变量作为我的fillna(),但是当我在fillna()inplace中时,底层数据不会改变.

a_n6 = a_n6[["PROV LAST", "PROV FIRST", "PROV MID", "SPEC NM"]].fillna("")
a_n6
Run Code Online (Sandbox Code Playgroud)

给我:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1542 entries, 0 to 3611
Data columns (total 4 columns):
PROV LAST     1542  non-null values
PROV FIRST    1542  non-null values
PROV MID      1542  non-null values
SPEC NM       1542  non-null values
dtypes: object(4)
Run Code Online (Sandbox Code Playgroud)

a_n6[["PROV LAST", "PROV FIRST", "PROV MID", "SPEC NM"]].fillna("", inplace=True)
a_n6
Run Code Online (Sandbox Code Playgroud)

给我:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1542 entries, 0 to 3611
Data columns (total 7 columns):
NPI           1103  non-null values
PIN           1542  non-null values
PROV FIRST    1541  non-null values
PROV LAST     1542  non-null values
PROV MID      1316  non-null values
SPEC NM       1541  non-null values
flag          439  non-null values
dtypes: float64(2), int64(1), object(4)
Run Code Online (Sandbox Code Playgroud)

这只是一排,但仍然令人沮丧.我究竟做错了什么?

C8H*_*4O2 20

使用a dict作为value参数fillna()

正如@rhkarls关于@ Jeff的回答的评论中所提到的,使用.loc索引到列列表将不支持inplace操作,我也觉得令人沮丧.这是一个解决方法.

例:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[1,2,3,4,np.nan],
                   'b':[6,7,8,np.nan,np.nan],
                   'x':[11,12,13,np.nan,np.nan],
                   'y':[16,np.nan,np.nan,19,np.nan]})
print(df)
#     a    b     x     y
#0  1.0  6.0  11.0  16.0
#1  2.0  7.0  12.0   NaN
#2  3.0  8.0  13.0   NaN
#3  4.0  NaN   NaN  19.0
#4  NaN  NaN   NaN   NaN
Run Code Online (Sandbox Code Playgroud)

比方说,我们希望fillnaxy只, ab.

我希望使用.loc(如在作业中),但它没有,如前所述:

# doesn't work
df.loc[:,['x','y']].fillna(0, inplace=True)
print(df) # nothing changed
Run Code Online (Sandbox Code Playgroud)

但是,文档说明的value论点fillna()可以是:

另外还有一个dict/Series/DataFrame值,用于指定每个索引(对于Series)或列(对于DataFrame)使用哪个值.(不会填写dict/Series/DataFrame中的值).

事实证明,使用值的字典将起作用:

# works
df.fillna({'x':0, 'y':0}, inplace=True)
print(df)
#     a    b     x     y
#0  1.0  6.0  11.0  16.0
#1  2.0  7.0  12.0   0.0
#2  3.0  8.0  13.0   0.0
#3  4.0  NaN   0.0  19.0
#4  NaN  NaN   0.0   0.0
Run Code Online (Sandbox Code Playgroud)

此外,如果您的子集中有很多列,则可以使用dict理解,如:

df.fillna({x:0 for x in ['x','y']}, inplace=True) # also works
Run Code Online (Sandbox Code Playgroud)


Jef*_*eff 8

你正在填写一份副本(你当时看不到)

之一:

这是一个更深入的解释 熊猫:链式任务

  • 我认为inplace论证应该阻止它填写副本.如果它不改变函数的行为,那么`inplace` arg的意义是什么? (5认同)
  • 那么为什么即使允许使用fillna()? (3认同)
  • 如果使用.loc,Inplace将起作用.如果您正在处理副本,则Inplace不起作用.查看Jeff包含的链接.它不适用于字段列表(例如df.loc [:,[list of fields]]),但它可以在切片或单个字段上工作.有关此问题的详细信息,请参阅https://github.com/pandas-dev/pandas/issues/11984. (2认同)