我有一个 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 要小得多。
示例代码
示例代码中有太多拼写错误
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)
。