python - 熊猫。复制多索引级别
问题描述
我有一个带有多索引列的 DataFrame:
df = pd.DataFrame(np.arange(12).reshape(3,-1))
df.columns = [['A', 'A', 'B', 'B'], [0, 1, 0, 1]]
print(df)
看起来像这样:
A B
0 1 0 1
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
我想做一些类似df['C'] = df['B']
的事情:
A B C
0 1 0 1 0 1
0 0 1 2 3 2 3
1 6 7 8 9 8 9
2 12 13 14 15 14 15
我得到ValueError: Wrong number of items passed 2, placement implies 1
.
我也试过df.loc[:, slice('C', None)] = df['B']
没有运气。
实际上我的情况有点复杂:我在多索引(L0 I
)中多了一层,我想复制df['L0 I', 'B']
到df['L0 II', 'B']
(L0 II
不存在)。
解决方案
您可以提取列并MultiIndex
在列中创建:
df1 = df['B']
df1.columns = [['C'] * len(df1.columns), df1.columns]
print (df1)
C
0 1
0 2 3
1 6 7
2 10 11
或按切片和rename
第一级选择:
df1 = df.loc[:, slice('B', None)].rename(columns={'B':'C'}, level=0)
print (df1)
C
0 1
0 2 3
1 6 7
2 10 11
df = df.join(df1)
#alternative
#df = pd.concat([df,df1], axis=1)
print (df)
A B C
0 1 0 1 0 1
0 0 1 2 3 2 3
1 4 5 6 7 6 7
2 8 9 10 11 10 11
在这里工作的另一个解决方案是使用DataFrame.stack
,复制列DataFrame.assign
并重新整形DataFrame.unstack
:
df1 = df.stack().assign(C = lambda x: x['B']).unstack()
print (df1)
A B C
0 1 0 1 0 1
0 0 1 2 3 2 3
1 4 5 6 7 6 7
2 8 9 10 11 10 11
推荐阅读
- javascript - 在 React Native 中渲染网格/数独板
- python - 获取和发布 Django formset 时的问题
- php - array_intersect() 与 php 中的二维数组
- inner-join - 为什么加号处出现 INNER JOIN 错误?
- python - 使用 Amadeus Airport Search 自动完成 API 时出现 503:“服务不可用”
- r - 在 R 中绘制似然函数、先验分布和后验分布
- c++ - 向量后推在构造函数类内部不起作用
- python - 从 2gb .csv 文件中的 json 提取值的最佳方法
- watson-assistant - 关于如何在 IBM Watson Assistant 中将数字格式化为货币的建议
- javascript - 在 JSON 中存储样式值的最佳方式