[英]How can I remove nan columns if values are string/Integer dtypes at once?
我有這樣的數據:
In [1]: d = {'ID': [14, 14, 14, 14, 14, 14, 14, 15, 15],
'NAME': ['KWI', 'NED', 'RICK', 'NICH', 'DIONIC', 'RICHARD', 'ROCKY', 'CARLOS', 'SIDARTH'],
'ID_COUNTRY':[1, 2, 3,4,5,6,7,8,9],
'COUNTRY':['MEXICO', 'ITALY', 'CANADA', 'ENGLAND', 'GERMANY', 'UNITED STATES', 'JAPAN', 'SPAIN', 'BRAZIL'],
'ID_CITY':[np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
'CITY':[np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
'STATUS': ['OK', 'OK', 'OK', 'OK', 'OK', 'NOT', 'OK', 'NOT', 'OK']}
df = pd.DataFrame(data=d)
Out[2]:
ID NAME ID_COUNTRY COUNTRY ID_CITY CITY STATUS
0 14 KWI 1 MEXICO NaN NaN OK
1 14 NED 2 ITALY NaN NaN OK
2 14 RICK 3 CANADA NaN NaN OK
3 14 NICH 4 ENGLAND NaN NaN OK
4 14 DIONIC 5 GERMANY NaN NaN OK
5 14 RICHARD 6 UNITED STATES NaN NaN NOT
6 14 ROCKY 7 JAPAN NaN NaN OK
7 15 CARLOS 8 SPAIN NaN NaN NOT
8 15 SIDHART 9 BRAZIL NaN NaN OK
然后我需要使用以下方法設置每列的 dtypes 以供將來使用:
df.iloc[:, [0, 2, 4]] = df.iloc[:, [0, 2, 4]].astype("Int64")
df.iloc[:, [1, 3, 5, 6]] = df.iloc[:, [1, 3, 5, 6]].astype("string")
執行此操作后,我想刪除具有完全nan
值的列,並將刪除的列的名稱刪除到另一個具有相同列名的數據框中,如下所示:
In [3]: d1 = {'ID': [14, 14, 14],
'NAME': ['KWI', 'NED', 'RICK'],
'ID_COUNTRY':[1, 2, 3],
'COUNTRY':['MEXICO', 'ITALY', 'CANADA'],
'ID_CITY':[20, 22, 24],
'CITY':['MX', 'AT', 'CA'],
'STATUS': ['OK', 'OK', 'OK']}
df1 = pd.DataFrame(data=d1)
Out [4]:
ID NAME ID_COUNTRY COUNTRY ID_CITY CITY STATUS
0 14 KWI 1 MEXICO 20 MX OK
1 14 NED 2 ITALY 22 AT OK
2 14 RICK 3 CANADA 24 CA OK
這里的問題是當我嘗試df['CITY'].isna()
因為列中的所有值都給了我False
。 我不知道為什么給我那個,當我嘗試使用df['ID_CITY'].isna()
給我True
。 我猜是因為一個是Int64
而另一個object
。 例子:
In [5]: df4['ID_CITY'].isna()
Out[6]:
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 True
8 True
Name: ID_CITY, dtype: bool
In [7]: df4['CITY'].isna()
Out[8]:
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
Name: CITY, dtype: bool
在更正我在df
和df1
所需輸出之前提到的內容之后:
Out[9]:
ID NAME ID_COUNTRY COUNTRY STATUS
0 14 KWI 1 MEXICO OK
1 14 NED 2 ITALY OK
2 14 RICK 3 CANADA OK
3 14 NICH 4 ENGLAND OK
4 14 DIONIC 5 GERMANY OK
5 14 RICHARD 6 UNITED STATES NOT
6 14 ROCKY 7 JAPAN OK
7 15 CARLOS 8 SPAIN NOT
8 15 SIDHART 9 BRAZIL OK
Out [10]:
ID NAME ID_COUNTRY COUNTRY STATUS
0 14 KWI 1 MEXICO OK
1 14 NED 2 ITALY OK
2 14 RICK 3 CANADA OK
感謝閱讀我。
假設您的輸入是(而不是使用列索引,我只是使用列名進行說明):
d = {'ID': [14, 14, 14, 14, 14, 14, 14, 15, 15],
'NAME': ['KWI', 'NED', 'RICK', 'NICH', 'DIONIC', 'RICHARD', 'ROCKY', 'CARLOS', 'SIDARTH'],
'ID_COUNTRY':[1, 2, 3,4,5,6,7,8,9],
'COUNTRY':['MEXICO', 'ITALY', 'CANADA', 'ENGLAND', 'GERMANY', 'UNITED STATES', 'JAPAN', 'SPAIN', 'BRAZIL'],
'ID_CITY':[np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
'CITY':[np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
'STATUS': ['OK', 'OK', 'OK', 'OK', 'OK', 'NOT', 'OK', 'NOT', 'OK']}
df = pd.DataFrame(data=d)
您可以將 pd 對象轉換為指定的dtype
。 為此,您可以使用Int64
和str
(而不是代碼中的字符串) [見鏈接] 。
df[['ID', 'ID_COUNTRY', 'ID_CITY']] = df[['ID', 'ID_COUNTRY', 'ID_CITY']].astype("Int64")
df[['NAME', 'COUNTRY', 'CITY', 'STATUS']] = df[['NAME', 'COUNTRY', 'CITY', 'STATUS']].astype("str")
通過臨時類型轉換,您可以確定 NaN 值。 為此,請考慮到 float 接受帶有可選前綴+
或-
的字符串nan
表示非數字 (NaN)。
df['CITY'].astype("float").isna()
輸出:
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 True
8 True
Name: CITY, dtype: bool
任何一個
df['ID_CITY'].isna()
或者
df['ID_CITY'].astype("float").isna()
將導致:
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 True
8 True
Name: ID_CITY, dtype: bool
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.