簡體   English   中英

在Pandas DataFrame多行標題中標記空值

[英]Mark Empty values in Pandas DataFrame Multi-Row Header

我有一個名為mrh.csv的CSV文件,該文件具有代表標題的前兩行:

Name,Height,Age
"",Metres,""
A,-1,25
B,95,-1

我正在使用以下代碼將其讀入DataFrame:

import pandas as pd
pd.read_csv('mrh.csv', header=[0,1], na_values=[-1,''])

這將導致具有以下內容的數據框:

    Name                Height  Age
    Unnamed: 0_level_1  Metres  Unnamed: 2_level_1

0   A                   NaN     25.0
1   B                   95.0    NaN

使用read_csv的na_values參數,我可以在文件中將標記為-1的缺失值標記為標記,但是當標記為“”(我也嘗試過-1)時,缺失的標頭行值將顯示為未命名:x_level_y (如果為則為 -1)而是使用它)。

有沒有一種方法可以不顯示缺少的值-刪除未命名的x_level_y或用有意義的值替代它?

所需的輸出1:

    Name  Height  Age
          Metres    

0   A     NaN     25.0
1   B     95.0    NaN

所需的輸出2:

    Name  Height  Age
    -     Metres  - 

0   A     NaN     25.0
1   B     95.0    NaN

我認為使用read_csv不可能,可以在加載后修改索引:

from io import StringIO

txt = '''Name,Height,Age
"",Metres,""
A,-1,25
B,95,-1'''

df = pd.read_csv(StringIO(txt),header=[0,1],na_values=['-1',''])

df.columns = df.columns.set_levels(df.columns.get_level_values(level=1).str.replace('Un.*',''),level=1)
df.columns = df.columns.set_levels(df.columns.get_level_values(level=1).str.replace('Un.*',''),level=1)

輸出:

   Name Height   Age
        Metres      
0    A    NaN  25.0
1    B   95.0   NaN

要知道兩次分配df.columns,可以在此處檢查。 它仍然神秘

編輯, set_levels仍然是可以使用的越野車:

df.columns = df.columns.set_levels(df.columns.levels[1].str.replace('Un.*', ''), level=1)

您可以創建新的MultiIndex並分配給各columns

df = pd.read_csv('mrh.csv', header=[0,1], na_values=[-1,''])

a = df.columns.get_level_values(level=0)
b = df.columns.get_level_values(level=1).str.replace('Un.*','')
df.columns = [a, b]
print (df)
  Name Height   Age
       Metres      
0    A    NaN  25.0
1    B   95.0   NaN

要么:

a = df.columns.get_level_values(level=0)
b = df.columns.get_level_values(level=1).str.replace('Un.*','-')
df.columns = [a, b]
print (df)
  Name Height   Age
     - Metres     -
0    A    NaN  25.0
1    B   95.0   NaN
import pandas as pd
pd.read_csv("mrh.csv").fillna("-").to_csv("mrh.csv",index=None)
df1 = pd.read_csv("mrh.csv",header=[0,1],na_values=[-1,''])
df1

輸出:

   Name Height  Age
   -    Metres  -
0   A   NaN    25.0
1   B   95     NaN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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