如果最后一行是nan,如何删除列

时间:2020-10-17 20:21:01

标签: python pandas

我找到了一些有关如何基于全部或阈值删除列的示例,但是我无法找到解决我的特殊问题(如果最后一行是nan则删除该列)的解决方案。原因是我使用时间序列数据,其中数据的收集并非全部同时开始,这很好,但是如果使用以前的解决方案之一,它将删除95%的数据集。但是,我不希望最近列为nan的数据,因为这意味着它已失效。

A B C
nan t x 
1 2 3
x y z
4 nan 6

返回

A C
nan x
1 3
x z
4 6

5 个答案:

答案 0 :(得分:4)

您还可以执行类似的操作

df.loc[:, ~df.iloc[-1].isna()]
    A   C
0   NaN x
1   1   3
2   x   z
3   4   6

答案 1 :(得分:3)

尝试使用dropna

df = df.dropna(axis=1, subset=[df.index[-1]], how='any')
Out[8]: 
     A  C
0  NaN  x
1    1  3
2    x  z
3    4  6

答案 2 :(得分:2)

您可以使用布尔系列选择要删除的列

df.drop(df.loc[:,df.iloc[-1].isna()], axis=1)

出局:

     A  C
0  NaN  x
1    1  3
2    x  z
3    4  6

答案 3 :(得分:2)

您可以使用.iloc.loc.notna()来解决问题。

df = pd.DataFrame({"A":[np.nan, 1,"x",4],  
                   "B":["t",2,"y",np.nan],
                   "C":["x",3,"z",6]})
 
df = df.loc[:,df.iloc[-1,:].notna()]

答案 4 :(得分:1)

for i in range(temp_df.shape[1]):
    if temp_df.iloc[-1,i] == 'nan':
        temp_df = temp_df.drop(i,1)

这将为您工作。 基本上,我在这里所做的是遍历所有列,并检查最后一个条目是否为“ nan”,然后删除该列。 temp_df.shape [1] 这是列数。

pandas.df.drop(i,1) i代表列索引,1代表您要删除列。

编辑: 我在同一篇文章中阅读了其他答案,在我看来,notna最好(我会使用它),但是这种方法的优势在于,有人可以比较他们想要的任何东西。 我发现的另一个方法是isull(),它是熊猫库中的一个函数,它将像这样工作:

for i in range(temp_df.shape[1]):
    if temp_df.iloc[-1,i].isnull():
        temp_df = temp_df.drop(i,1)