Python 在DataFrame多行标题中标记空值
我有一个名为mrh.CSV的CSV文件,它的前两行表示标题: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
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。