从具有嵌套列标题的Excel文件导入数据时出现问题。几个列名是整数,我想将它们作为字符串。
假设我在excel中有此表:
| | 1 | string_name | |
|-----|-------------------|-------------------|-------------------|
| cat | value1 | value2 | value3 |
| A | 0,972040109825603 | 0,056557228055112 | 0,976955685101913 |
| B | 0,320747613034341 | 0,149341390123682 | 0,638191659714267 |
| C | 0,790582690075218 | 0,72042597879107 | 0,001334403836215 |
| D | 0,536830294783296 | 0,374625041462985 | 0,400407699629966 |
| E | 0,407865892894399 | 0,622162974355068 | 0,374418521692358 |
我将其导入为数据框
df = pd.read_excel('expl.xlsm', header=[0, 1])
print(df)
给出
1 string_name
cat value1 value2 value3
A 0.972040 0.056557 0.976956
B 0.320748 0.149341 0.638192
C 0.790583 0.720426 0.001334
D 0.536830 0.374625 0.400408
E 0.407866 0.622163 0.374419
IN:
df.columns
OUT:
MultiIndex(levels=[[1, 'string_name'], ['value1', 'value2', 'value3']],
labels=[[0, 0, 1], [0, 1, 2]],
names=[None, 'cat'])
所以我想将1转换为'1'。或者理想情况下,首先导入仅具有字符串类型列名称的数据框。
我通过
获得第一级的列值df.columns.get_level_values(0)
OUT:
Index([1, 1, 'string_name'], dtype='object')
但是
df.columns.get_level_values(0) = df.columns.get_level_values(0).astype(str)
返回错误:
df.columns.get_level_values(0) = df.columns.get_level_values(0).astype(str)
SyntaxError: can't assign to function call
如何更改列名的数据类型或仅使用字符串列标题导入数据?
答案 0 :(得分:1)
您需要创建新的MultiIndex
并分配回来:
a = df.columns.get_level_values(0).astype(str)
b = df.columns.get_level_values(1)
df.columns = pd.MultiIndex.from_arrays([a,b], names=df.columns.names)
print (df.columns)
MultiIndex(levels=[['1', 'string_name'], ['cat', 'value1', 'value2']],
labels=[[0, 0, 1], [0, 1, 2]],
names=[None, 'cat'])
如果仅过滤MultiIndex的第一级中的字符串值是可能的,则创建布尔掩码并通过boolean indexing
和loc
进行过滤:
mask = df.columns.get_level_values(0).map(lambda x: isinstance(x, str))
df1 = df.loc[:, mask]
print (df1)
string_name
value2
A 0.976956
B 0.638192
C 0.001334
D 0.400408
E 0.374419