[英]Combining pandas data frames with overlapping columns / rows
我正在寻找一种有效的方式来组合100个熊猫数据框,这些数据框代表信息点的网格。 这些数据帧的每个点都是唯一的,并且不与另一个数据帧的点重叠,但是它们确实在更大的拼凑空间中共享列和行。 即
1 2 3 4 5 6 7 8 9
A df1, df1, df1, df2, df2, df2, df3, df3, df3
B df1, df1, df1, df2, df2, df2, df3, df3, df3
C df1, df1, df1, df2, df2, df2, df3, df3, df3
D df4, df4, df4, df5, df5, df5, etc, etc, etc
E df4, df4, df4, df5, df5, df5, etc, etc, etc
F df4, df4, df4, df5, df5, df5, etc, etc, etc
熊猫的连接仅在列或行轴上组合,而不能同时在两者上组合。 因此,我一直在尝试增加数据帧的数量,并使用df1.combine_first(df2)方法(无限重复)。
这是最好的方法,还是我应该意识到的另一种更有效的方法?
基于不重叠的数据点并假设非常规则的数据(在这种情况下为3x3),这是对便利性和效率角度的快速猜测。
df1=pd.DataFrame( np.random.randn(3,3), index=list('ABC'), columns=list('123') )
df2=pd.DataFrame( np.random.randn(3,3), index=list('DEF'), columns=list('123') )
df3=pd.DataFrame( np.random.randn(3,3), index=list('ABC'), columns=list('456') )
df4=pd.DataFrame( np.random.randn(3,3), index=list('DEF'), columns=list('456') )
combine_first
方法的优势在于,您可以仅转储列表中的所有内容而不必担心顺序:
%%timeit
comb_df = pd.DataFrame()
for df in [df1,df2,df3,df4]:
comb_df = comb_df.combine_first( df )
100 loops, best of 3: 8.92 ms per loop
concat
方法要求您按特定顺序对事物进行分组,但速度要快两倍以上:
%%timeit
df5 = pd.concat( [df1,df2], axis=0 )
df6 = pd.concat( [df3,df4], axis=0 )
df7 = pd.concat( [df5,df6], axis=1 )
100 loops, best of 3: 3.84 ms per loop
快速检查两种方法是否相同:
all( comb_df == df7 )
True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.