我有一個包含可變列數的資料集(每行中的列數由行中的特定值決定)。
這是我目前使用的方法:-
pd.read_csv(file_path, names=list(range(100)).dropna(axis=1, how='all')
這會洗掉所有完全為空的列。
唯一的問題是中間可能有包含空值的列。例如:-
abc | | def | 20 | 1 | 2 | ..... | x | | |
def | | ghi | 10 | 1 | 2 | ..... | | | |
ghi | | jkl | 20 | 1 | 2 | ..... | y | | |
在這里,我想保留第二列,即使它完全為空,但洗掉最后完全為空的列。基本上,這應該轉換為:-
abc | | def | 20 | 1 | 2 | ..... | x
def | | ghi | 10 | 1 | 2 | ..... |
ghi | | jkl | 30 | 1 | 2 | ..... | y
由于資料幀有數千行,回圈太慢了。誰能建議如何解決這個問題?
uj5u.com熱心網友回復:
假設此示例輸入為df:
0 1 2 3 4 5
0 1 NaN 3.0 4 NaN NaN
1 1 NaN 3.0 4 NaN NaN
2 1 NaN NaN 4 NaN NaN
3 1 NaN 3.0 4 NaN NaN
您可以使用df.notna().any(0)(或任何其他方法,如果您希望具有不同條件的閾值)計算該列是否為空,它給出 (as array): [ True, False, False, True, False, False]。
然后訣竅是cumsum在反向陣列上使用以將 False 值保留在最后,但要填充以前的值:
mask = df.notna().any(0)[::-1].cumsum()[::-1].astype(bool)
# [ True, True, True, True, False, False]
您可以使用它來切片列:
>>> df.loc[:,mask] # or df.loc(1)[mask]
0 1 2 3
0 1 NaN 3.0 4
1 1 NaN 3.0 4
2 1 NaN NaN 4
3 1 NaN 3.0 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/370817.html
上一篇:從df.groupby.().size()結果中獲取所有最大值和最小值
下一篇:將一個資料框串列分成多個資料框
