gpt4 book ai didi

python - 在共享索引上加入 Pandas Dataframes

转载 作者:太空狗 更新时间:2023-10-30 00:16:53 28 4
gpt4 key购买 nike

我有 3 个 DataFrames,它们具有不同数量的共享索引。例如:

>>> df0=pd.DataFrame(index=pd.MultiIndex.from_product([[1,2,3,4],[2011,2012],['A','B']], names=['Season','Year','Location']))
>>> df0['Value0']=np.random.randint(1,100,len(df0))
>>>
>>> df1=pd.DataFrame(index=pd.MultiIndex.from_product([[2011,2012],['A','B']], names=['Year','Location']))
>>> df1['Value1']=np.random.randint(1,100,len(df1))
>>>
>>> df2=pd.DataFrame(index=['A','B'])
>>> df2.index.name='Location'
>>> df2['Value2']=np.random.randint(1,100,len(df2))
>>> df0
Value0
Season Year Location
1 2011 A 18
B 63
2012 A 88
B 30
2 2011 A 35
B 60
2012 A 61
B 4
3 2011 A 70
B 9
2012 A 11
B 38
4 2011 A 68
B 57
2012 A 13
B 35
>>> df1
Value1
Year Location
2011 A 22
B 74
2012 A 73
B 44
>>> df2
Value2
Location
A 70
B 85
>>>

我正在寻找加入他们共同索引的最佳方式。

我尝试过的事情:

1) pd.concat([df0,df1,df2],1) 会很好,因为它接受数据帧列表,但这似乎仅在数据帧具有相同编号时才有效索引。

2) 将任一多索引数据帧与单个索引 DataFrame 连接起来:df1.join(df2)df0.join(df2)。但是,将具有两个索引的 DataFrame 与具有三个索引的 DataFrame 连接起来不会:df0.join(df1) 并给我以下错误: “NotImplementedError:未实现在多索引上合并超过一层重叠”

此时,我一直采用的方法是重置索引并使用pd.merge()。见下文:

def JoinMulti(DFList):
FinalDF=DFList[0].reset_index()
for OtherDF in DFList[1:]:
FinalDF=pd.merge(FinalDF, OtherDF.reset_index(), how='outer')

#Now I want reindex it so that it's indexed the same as the `DataFrame` with the highest number of levels
NLevels=[x.index.nlevels for x in DFList]
MaxIndexPos=NLevels.index(max(NLevels))
FinalIndex=DFList[MaxIndexPos].index
FinalDF=FinalDF.set_index(FinalIndex.names).reindex(FinalIndex)
return FinalDF

>>> JoinMulti([df0,df1,df2])
Value0 Value1 Value2
Season Year Location
1 2011 A 43 5 96
B 63 46 97
2012 A 68 6 96
B 23 99 97
2 2011 A 66 5 96
B 30 46 97
2012 A 45 6 96
B 79 99 97
3 2011 A 66 5 96
B 21 46 97
2012 A 86 6 96
B 11 99 97
4 2011 A 95 5 96
B 58 46 97
2012 A 32 6 96
B 80 99 97
>>>

这是一个合理的方法吗?是否有任何可以改进的地方或我忘记的任何异常(exception)情况?

最佳答案

我修改了 Stefan Jansen 的解决方案:

def jez(df0,df1,df2):
df1 = df1.join(df2)
df0 = df0.reset_index('Season')
FinalDF = df0.join(df1).set_index('Season', append=True).reorder_levels(['Season', 'Year', 'Location']).sortlevel()
return FinalDF

print jez(df0,df1,df2)

时间:

In [41]: %timeit jez(df0,df1,df2)
The slowest run took 4.14 times longer than the fastest. This could mean that an intermediate result is being cached
100 loops, best of 3: 5.02 ms per loop

In [42]: %timeit JoinMulti([df0,df1,df2])
100 loops, best of 3: 9.83 ms per loop

关于python - 在共享索引上加入 Pandas Dataframes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34073280/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com