我有一个形状为(42538, 145)
的数据框,其中有超过50列,所有行的值均为NaN
。
我想删除这些列而不在df.drop
中指定每个列的名称。
答案 0 :(得分:1)
您可能想从df.notnull
开始获取所有非NaN的位置。
然后,您可以在结果上使用df.any
,并将axis
设置为零,以检查所有列中的not-NaNness。
生成的布尔系列可以用于索引您的列:Pandas Select DataFrame columns using boolean。有两种不同的选择:
df = df.iloc[:, df.notnull().any(axis=0).values]
sel = df.notnull().any(axis=0)
df = df[sel.index[sel]]
答案 1 :(得分:0)
您可以在axis=1
上使用pd.DataFrame.dropna
:
df = pd.DataFrame({'A': [1, 2, 3], 'B': [np.nan]*3,
'C': [4, 5, 6], 'D': [np.nan]*3})
df_new = df.dropna(axis=1)
print(df_new)
A C
0 1 4
1 2 5
2 3 6
答案 2 :(得分:0)
试试这个:
tmp_col = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]
df1.columns = tmp_col
df2 = df1[(df1[2] == 'RO En') | (df1[2] == 'RO En Adj')]
df2[['bp1','bp2']] = df2[6].str.split('-',expand=True)
df2[['mn1','mn2']] = df2[11].str.split(' ',expand=True)
df2['FN'] = df2[10] + ' ' + df2[11]
df2.loc[df2[2] == 'RO ', 'RT'] = ''
df2.loc[df2[2] == 'RO ', ''] = ''
df2.loc[df2[2] == 'RO ', ''] = df2['bp1']
df2.loc[df2[2] == 'RO ', ''] = df2[12]
df3 = df2[df2[8].str.contains('')]
df4 = df2[df2[8].str.contains(')]
print(df3,df4)
pm_col = []
df3 = df3[[10,11,'BP',16,15,15,17,15,'RT',14,21,19,'FN','mn2']]
df3.columns = pm_col
df4 = df4[[10,11,'BP',16,15,15,17,15,'RT',14,21,19,'FN','mn2']]
df4.columns = pm_col