在Pandas DataFrame多行标题中标记空值

时间:2018-01-02 11:17:44

标签: python pandas csv dataframe

我有一个名为 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

3 个答案:

答案 0 :(得分:1)

我认为不可能使用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,您可以查看here。它还是神秘的

编辑,set_levels仍然是您可以使用的错误:

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

答案 1 :(得分: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

答案 2 :(得分:0)

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