如何从python中的数据框中删除无单元格

时间:2017-10-05 10:37:16

标签: python pandas dataframe

我有一个df,

        contents    values  scoresBinned    categories
    0   Buy           484   (375, 500]       Bin 4
    1   Sell          429   (375, 500]       Bin 4
    2   Blanks        130   (125, 250]       Bin 2
    3   A             108   (0, 125]         Bin 1
    4   B             77    (0, 125]         Bin 1
    5   F              2    (0, 125]         Bin 1

因为我需要Bin作为我的标题我正在做df,pivot

 filter_df1=df[["contents","categories"]]

 pivot_df=filter_df1.pivot(columns="categories")

 print(pivot_df)

                contents
    categories  Bin 1      Bin 2    Bin 4
       0        None        None    Buy
       1        None        None    Sell
       2        None        Blanks  None
       3        A           None    None
       4        B           None    None
       5        F           None    None

我尝试了df.dropna(),但删除了整行,

我想要的df是,

            Bin 1      Bin 2    Bin 4
             A         Blanks   Buy
             B                  Sell
             F          

1 个答案:

答案 0 :(得分:2)

您可以使用sortedboolean indexingfillna来执行此操作。

pm = pivot_df.apply(sorted,key=pd.isnull)
new = pm[~pd.isnull(pm).all(1)].fillna('')

输出:

           contents              
categories    Bin 1   Bin 2 Bin 4
0                 A  Blanks   Buy
1                 B          Sell
2                 F              

解释

基于None的排序将给出

           contents              
categories    Bin 1   Bin 2 Bin 4
0                 A  Blanks   Buy
1                 B    None  Sell
2                 F    None  None
3              None    None  None
4              None    None  None
5              None    None  None

现在选择那些行中所有值都不为空的行。所以我们可以使用~pd.isnull(pm).all(1)(这里~不是将false转换为true的运算符,反之亦然)。哪个会给出

0     True
1     True
2     True
3    False
4    False
5    False
dtype: bool 

后来boolen索引选择数据,pm[~pd.isnull(pm).all(1)]

        contents              
categories    Bin 1   Bin 2 Bin 4
0                 A  Blanks   Buy
1                 B    None  Sell
2                 F    None  None

fillna('')将使用''填充无值。希望它有所帮助。