Pandas数据帧fillna()只有一些列到位

时间:2016-06-30 22:06:17

标签: python pandas dataframe

我试图在Pandas数据帧中填充任何值,仅为列的某些子集填充0。

当我这样做时:

import pandas as pd
df = pd.DataFrame(data={'a':[1,2,3,None],'b':[4,5,None,6],'c':[None,None,7,8]})
print df
df.fillna(value=0, inplace=True)
print df

输出:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  NaN  7.0
3  NaN  6.0  8.0
     a    b    c
0  1.0  4.0  0.0
1  2.0  5.0  0.0
2  3.0  0.0  7.0
3  0.0  6.0  8.0

它用None替换每个0。我想要做的是,只替换列Nonea中的b,而不是c

这样做的最佳方式是什么?

9 个答案:

答案 0 :(得分:131)

您可以选择所需的列并通过分配执行:

df[['a', 'b']] = df[['a','b']].fillna(value=0)

结果输出符合预期:

     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

答案 1 :(得分:43)

您可以使用dictfillna为不同的列

使用不同的值
df.fillna({'a':0,'b':0})
Out[829]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

分配后

df=df.fillna({'a':0,'b':0})
df
Out[831]: 
     a    b    c
0  1.0  4.0  NaN
1  2.0  5.0  NaN
2  3.0  0.0  7.0
3  0.0  6.0  8.0

答案 2 :(得分:10)

您可以使用Wen的解决方案和inplace = True来避免复制对象:

public class Main
{
    public static void main(String[] args)
    {
        System.out.printIn(CheckPoint(-3, 2, 2, 3));
    }

    private static bool CheckPoint(float slope, float yInt, int x, int y)
    {
        //Standard form for line is y = ax + b
        if(y == (slope * x) + yInt)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

哪个收益率:

df.fillna({'a':0, 'b':0}, inplace=True)
print(df)

答案 3 :(得分:2)

或类似的东西

df.loc[df['a'].isnull(),'a']=0
df.loc[df['b'].isnull(),'b']=0

还有更多内容:

for i in your_list:
    df.loc[df[i].isnull(),i]=0

答案 4 :(得分:2)

使用最上面的答案会产生有关更改df切片副本的警告。假设您还有其他列,一种更好的方法是传递字典:
df.fillna({'A': 'NA', 'B': 'NA'}, inplace=True)

答案 5 :(得分:1)

您可以在同一行中完成所有操作:

df[['a', 'b']].fillna(value=0, inplace=True)

崩溃:df[['a', 'b']]选择要为其填充NaN值的列,value=0告诉其为NaN填充零,而inplace=True将使更改永久生效,而无需进行该对象的副本。

答案 6 :(得分:1)

这应该可以工作并且没有复制警告

df[['a', 'b']] = df.loc[:,['a', 'b']].fillna(value=0)

答案 7 :(得分:0)

有时这种语法不起作用:

df[['col1','col2']] = df[['col1','col2']].fillna()

改为使用以下内容:

df['col1','col2']

答案 8 :(得分:0)

出于某种奇怪的原因,此DID不起作用(使用熊猫:'0.25.1')

df[['col1', 'col2']].fillna(value=0, inplace=True)

另一种解决方案:

subset_cols = ['col1','col2']
[df[col].fillna(0, inplace=True) for col in subset_cols]

示例:

df = pd.DataFrame(data={'col1':[1,2,np.nan,], 'col2':[1,np.nan,3], 'col3':[np.nan,2,3]})

输出:

   col1  col2  col3
0  1.00  1.00   nan
1  2.00   nan  2.00
2   nan  3.00  3.00

应用列表组件。填充值:

subset_cols = ['col1','col2']
[df[col].fillna(0, inplace=True) for col in subset_cols]

输出:

   col1  col2  col3
0  1.00  1.00   nan
1  2.00  0.00  2.00
2  0.00  3.00  3.00