簡體   English   中英

如果值一次是字符串/整數 dtypes,如何刪除 nan 列?

[英]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

在更正我在dfdf1所需輸出之前提到的內容之后:

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 為此,您可以使用Int64str (而不是代碼中的字符串) [見鏈接]

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM