从两个多索引数据帧创建一个大系列

问题描述 投票:0回答:1

我有一个 DataFrame 可以说 df1 具有多索引,例如

index1 = MultiIndex.from_tuples([('1','c'),('1','d'),('2','c'),('2','d')], names = ['level1','level2'])

还有另一个 DataFrame,比如说具有多索引的 df2,例如

index2 =  MultiIndex.from_tuples([(1,'1','c'), (2,'1','c'),(3,'1','d'),(4,'2','d'),(6,'2','d')],names = ['level0','level1','level2'])

我想要做的是创建一个 pd.Series 对象,其索引为“level0”(它们都是唯一的),基于 df1 中特定列的级别“level1”、“level2”。例如如果

df1 = pd.DataFrame({'A':['foo','bar','baz','qux'],'B':[['foo1','bar1','baz1','qux1']]}, index = index1) 
我希望输入为 df1、df2 (仅此 DataFrame 的索引与其内容无关)、列名称,例如如果我采用 df1,列名“B”和索引 index2,结果应该是
pd.Series('foo1','foo1', 'bar1', 'qux1','qux1', index = [1,2,3,4,6])

我写了一个有效的快速代码

result = [df1[column_name].loc[indx[1:]][0] for indx in df2.index] 
new_indx = [i[0] for i in df2.index]
result = pd.Series(result, index = new_index)

但是,这非常慢,因为我的第二个 DataFrame 很大,我想要一个解决方案,在没有 pandas 的情况下,我不需要循环遍历与 df2 相关的任何内容(例如通过 df2.index)。通过 df1 进行常规 python 循环是可以的,因为这个 DataFrame 要小得多。

python pandas multi-index
1个回答
0
投票

示例代码

示例代码中有太多拼写错误

import pandas as pd
index1 = pd.MultiIndex.from_tuples([('1','c'),('1','d'),('2','c'),('2','d')], names=['level1','level2'])
df1 = pd.DataFrame({'A':['foo','bar','baz','qux'],' B':['foo1','bar1','baz1','qux1']}, index=index1)
index2 = pd.MultiIndex.from_tuples([(1,'1','c'), (2,'1','c'),(3,'1','d'),(4,'2','d'),(6,'2','d')], names = ['level0','level1','level2'])

df1

                A   B
level1  level2      
1       c       foo foo1
        d       bar bar1
2       c       baz baz1
        d       qux qux1

index2
(df2的索引):

MultiIndex([(1, '1', 'c'),
            (2, '1', 'c'),
            (3, '1', 'd'),
            (4, '2', 'd'),
            (6, '2', 'd')],
           names=['level0', 'level1', 'level2'])

代码

index2.to_frame().join(df1).droplevel([0, 1])['B']

输出:

level0
1    foo1
2    foo1
3    bar1
4    qux1
6    qux1
Name: B, dtype: object

要删除名为 level0 的索引名称,请在代码末尾添加

.rename_axis('')

除了

.droplevel([0, 1])
,您还可以使用
.droplevel(df1.index.names)

© www.soinside.com 2019 - 2024. All rights reserved.