基于现有列级别值的 MultiIndex DataFrame 中的新级别
New level in MultiIndex DataFrame based on existing column level values
假设我有一个这样的 DataFrame:
df = pd.DataFrame(data = [[1,2,3,4,5,6], [3,4,5,6,7,8]],
columns = pd.MultiIndex.from_product([('A1', 'B1', 'A2'), (10,20)], names=['level_0','level_1']))
这是它的样子:
DataFrame image
我想在包含 1
的列中添加一个 新级别 ,其中 level_0
值包含 "1"
和 2
其中 level_0 值包含 "2"
。所以,基本上:
- 其中
level_0 == "A1"
--> new_level
= 1
- 其中
level_0 == "B1"
--> new_level
= 1
- 其中
level_0 == "A2"
--> new_level
= 2
有什么建议吗?
您可以使用正则表达式提取值((\d+)$
= 值的最后几位)并使用 MultiIndex.from_arrays
:
重新处理 MultiIndex
values = df.columns.get_level_values('level_0').str.extract('(\d+)$', expand=False)
# ['1', '1', '1', '1', '2', '2']
df.columns = pd.MultiIndex.from_arrays([*zip(*df.columns.to_list()), values],
names=[*df.columns.names, 'level_2']
)
注意。这推广到任何 XXX00 值
输出:
level_0 A1 B1 A2
level_1 10 20 10 20 10 20
level_2 1 1 1 1 2 2
0 1 2 3 4 5 6
1 3 4 5 6 7 8
使用列表理解从第一级值中提取数字并通过 MultiIndex.from_tuples
:
创建新的 MultiIndex
import re
df.columns = pd.MultiIndex.from_tuples([(re.findall(r'(\d+)$', x[0])[0], *x)
for x in df.columns.tolist()],
names=('new_level',*df.columns.names))
print (df)
new_level 1 2
level_0 A1 B1 A2
level_1 10 20 10 20 10 20
0 1 2 3 4 5 6
1 3 4 5 6 7 8
假设我有一个这样的 DataFrame:
df = pd.DataFrame(data = [[1,2,3,4,5,6], [3,4,5,6,7,8]],
columns = pd.MultiIndex.from_product([('A1', 'B1', 'A2'), (10,20)], names=['level_0','level_1']))
这是它的样子: DataFrame image
我想在包含 1
的列中添加一个 新级别 ,其中 level_0
值包含 "1"
和 2
其中 level_0 值包含 "2"
。所以,基本上:
- 其中
level_0 == "A1"
-->new_level
=1
- 其中
level_0 == "B1"
-->new_level
=1
- 其中
level_0 == "A2"
-->new_level
=2
有什么建议吗?
您可以使用正则表达式提取值((\d+)$
= 值的最后几位)并使用 MultiIndex.from_arrays
:
values = df.columns.get_level_values('level_0').str.extract('(\d+)$', expand=False)
# ['1', '1', '1', '1', '2', '2']
df.columns = pd.MultiIndex.from_arrays([*zip(*df.columns.to_list()), values],
names=[*df.columns.names, 'level_2']
)
注意。这推广到任何 XXX00 值
输出:
level_0 A1 B1 A2
level_1 10 20 10 20 10 20
level_2 1 1 1 1 2 2
0 1 2 3 4 5 6
1 3 4 5 6 7 8
使用列表理解从第一级值中提取数字并通过 MultiIndex.from_tuples
:
import re
df.columns = pd.MultiIndex.from_tuples([(re.findall(r'(\d+)$', x[0])[0], *x)
for x in df.columns.tolist()],
names=('new_level',*df.columns.names))
print (df)
new_level 1 2
level_0 A1 B1 A2
level_1 10 20 10 20 10 20
0 1 2 3 4 5 6
1 3 4 5 6 7 8