我找到了一些有关如何基于全部或阈值删除列的示例,但是我无法找到解决我的特殊问题(如果最后一行是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
答案 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)