如何做到Multi-Columnfrom_tuples?
How to do Multi-Column from_tuples?
我知道如何使用 pd.MultiIndex.from_tuples()
来改变
Value
(A,a) 1
(B,a) 2
(B,b) 3
进入
Value
Caps Lower
A a 1
B a 2
B b 3
但是如何更改表单中的列元组
(A, a) (A, b) (B,a) (B,b)
index
1 1 2 2 3
2 2 3 3 2
3 3 4 4 1
进入表格
Caps A B
Lower a b a b
index
1 1 2 2 3
2 2 3 3 2
3 3 4 4 1
非常感谢。
编辑: 我有元组列 header 的原因是,当我将具有单级列的 DataFrame 连接到具有 [=39= 的 DataFrame 时] 列,它将 Multi-Column 转换为字符串元组格式,并将单个级别保留为单个字符串。
编辑 2 - 替代解决方案: 如前所述,这里的问题是通过具有不同列级别大小的 join
引起的。这意味着 Multi-Column 被简化为一个字符串元组。为了解决这个问题,在加入之前,我使用 df.columns = [('col_level_0','col_level_1','col_level_2')]
作为我希望加入的 DataFrame。
将 pd.MultiIndex.from_tuples
的结果直接分配给 columns
,并传入您现有的列:
In [186]:
l=[('A', 'a'), ('A', 'b'), ('B','a'), ('B','b')]
df = pd.DataFrame(np.random.randn(5,4), columns = l)
df
Out[186]:
(A, a) (A, b) (B, a) (B, b)
0 -0.876353 0.553742 1.631858 -0.561309
1 0.463058 -0.455014 -0.491336 -1.436059
2 0.337810 0.233624 -0.571749 -2.259763
3 1.073057 -0.475894 0.999643 -0.379743
4 0.441800 0.311202 -0.191552 0.291268
In [187]:
df.columns = pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower'])
df
Out[187]:
Caps A B
Lower a b a b
0 -0.876353 0.553742 1.631858 -0.561309
1 0.463058 -0.455014 -0.491336 -1.436059
2 0.337810 0.233624 -0.571749 -2.259763
3 1.073057 -0.475894 0.999643 -0.379743
4 0.441800 0.311202 -0.191552 0.291268
请注意,您可以直接分配给 columns
属性的 names
属性,如下所示:
df.columns.names = ['Caps','Lower']
不要与 name
属性混淆
另一个解决方案是使用 MultiIndex.from_tuples
和参数 names
:
import pandas as pd
df = pd.DataFrame({'Value': [1,2,3]}, index=[('A','a'),('B','a'),('B','b')])
print (df)
Value
(A, a) 1
(B, a) 2
(B, b) 3
df.index = pd.MultiIndex.from_tuples(df.index, names=['Caps','Lower'])
print (df)
Value
Caps Lower
A a 1
B a 2
b 3
这同样适用于 columns
,参见 :
df.columns= pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower'])
我知道如何使用 pd.MultiIndex.from_tuples()
来改变
Value
(A,a) 1
(B,a) 2
(B,b) 3
进入
Value
Caps Lower
A a 1
B a 2
B b 3
但是如何更改表单中的列元组
(A, a) (A, b) (B,a) (B,b)
index
1 1 2 2 3
2 2 3 3 2
3 3 4 4 1
进入表格
Caps A B
Lower a b a b
index
1 1 2 2 3
2 2 3 3 2
3 3 4 4 1
非常感谢。
编辑: 我有元组列 header 的原因是,当我将具有单级列的 DataFrame 连接到具有 [=39= 的 DataFrame 时] 列,它将 Multi-Column 转换为字符串元组格式,并将单个级别保留为单个字符串。
编辑 2 - 替代解决方案: 如前所述,这里的问题是通过具有不同列级别大小的 join
引起的。这意味着 Multi-Column 被简化为一个字符串元组。为了解决这个问题,在加入之前,我使用 df.columns = [('col_level_0','col_level_1','col_level_2')]
作为我希望加入的 DataFrame。
将 pd.MultiIndex.from_tuples
的结果直接分配给 columns
,并传入您现有的列:
In [186]:
l=[('A', 'a'), ('A', 'b'), ('B','a'), ('B','b')]
df = pd.DataFrame(np.random.randn(5,4), columns = l)
df
Out[186]:
(A, a) (A, b) (B, a) (B, b)
0 -0.876353 0.553742 1.631858 -0.561309
1 0.463058 -0.455014 -0.491336 -1.436059
2 0.337810 0.233624 -0.571749 -2.259763
3 1.073057 -0.475894 0.999643 -0.379743
4 0.441800 0.311202 -0.191552 0.291268
In [187]:
df.columns = pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower'])
df
Out[187]:
Caps A B
Lower a b a b
0 -0.876353 0.553742 1.631858 -0.561309
1 0.463058 -0.455014 -0.491336 -1.436059
2 0.337810 0.233624 -0.571749 -2.259763
3 1.073057 -0.475894 0.999643 -0.379743
4 0.441800 0.311202 -0.191552 0.291268
请注意,您可以直接分配给 columns
属性的 names
属性,如下所示:
df.columns.names = ['Caps','Lower']
不要与 name
属性混淆
另一个解决方案是使用 MultiIndex.from_tuples
和参数 names
:
import pandas as pd
df = pd.DataFrame({'Value': [1,2,3]}, index=[('A','a'),('B','a'),('B','b')])
print (df)
Value
(A, a) 1
(B, a) 2
(B, b) 3
df.index = pd.MultiIndex.from_tuples(df.index, names=['Caps','Lower'])
print (df)
Value
Caps Lower
A a 1
B a 2
b 3
这同样适用于 columns
,参见
df.columns= pd.MultiIndex.from_tuples(df.columns, names=['Caps','Lower'])