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

Python 在DataFrame多行标题中标记空值,python,pandas,csv,dataframe,Python,Pandas,Csv,Dataframe,我有一个名为mrh.CSV的CSV文件,它的前两行表示标题: Name,Height,Age "",Metres,"" A,-1,25 B,95,-1 我使用以下代码将其读入数据帧: import pandas as pd pd.read_csv('mrh.csv', header=[0,1], na_values=[-1,'']) 这将生成包含以下内容的数据帧: Name Height Age Unnamed: 0_level_1 Metr

我有一个名为mrh.CSV的CSV文件,它的前两行表示标题:

Name,Height,Age
"",Metres,""
A,-1,25
B,95,-1
我使用以下代码将其读入数据帧:

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\u level\u 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
输出:

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

   Name Height  Age
   -    Metres  -
0   A   NaN    25.0
1   B   95     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\u levels
仍然有问题,您可以使用:

df.columns = df.columns.set_levels(df.columns.levels[1].str.replace('Un.*', ''), level=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两次,可以进行检查。它仍然神秘

编辑,
set\u levels
仍然有问题,您可以使用:

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

您可以创建新的多索引并分配给

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
或:


您可以创建新的多索引并分配给

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
或:



你所说的
有意义的值是什么意思,你能显示你想要得到的输出吗?@Dark我已经用所需的输出更新了问题。你所说的
有意义的值是什么意思,你能显示你想要的输出吗?@Dark我已经用所需的输出更新了问题。如果可能的话,我希望避免修改原始文件。虽然这个代码片段可能是解决方案,包括一个解释确实有助于提高你文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。如果可能,我希望避免修改原始文件。虽然此代码片段可能是解决方案,但包含解释确实有助于提高您的文章质量。请记住,您将在将来回答读者的问题,而这些人可能不知道您的代码提示的原因。看起来像是bug,最后一行应该是
df.columns=df.columns.set_levels(df.columns.get_level_values(level=1),level=1)
@jezrael您可以查看我发布的一个问题的链接,让我等到这个错误被修复。我在等我的问题的答案我真的很喜欢这个答案,但不知道怎么回答;)但我认为,如果您的解决方案有缺陷,最好不要使用它;)@耶斯雷尔,我们修一下怎么样。它仍然是一个很好的函数,只需要更新一点bug。它看起来像bug,最后一行应该是
df.columns=df.columns.set_levels(df.columns.get_level_value(level=1),level=1)
@jezrael你可以查看我发布的链接一个问题,让我等到bug被修复。我在等我的问题的答案我真的很喜欢这个答案,但不知道怎么回答;)但我认为,如果您的解决方案有缺陷,最好不要使用它;)@耶斯雷尔,我们修一下怎么样。这仍然是一个很好的功能,只是需要一点更新的错误。这几乎是一样的Minehmm,你生气了吗?因为我不这么认为,但我向你保证,如果你想要的话,你可以把这个解决方案加到你的答案中,我把它去掉。好吧,让它留下。我的仍然指向需要修复的bug。这几乎和我的一样。嗯,你生气了吗?因为我不这么认为,但我向你保证,如果你想要的话,你可以把这个解决方案加到你的答案中,我把它去掉。好吧,让它留下。我的仍然指向需要修复的bug。