Mar*_*sse 13 python merge pandas
我有一组DataFrames,包含数值和部分重叠的索引.如果索引出现在多个DataFrame中,我想合并它们.
import pandas as pd
import numpy as np
df1 = pd.DataFrame([1,2,3], columns=['col'], index=['a','b','c'])
df2 = pd.DataFrame([4,5,6], columns=['col'], index=['b','c','d'])
Run Code Online (Sandbox Code Playgroud)
这给了我两个DataFrame:
col col
a 1 b 4
b 2 c 5
c 3 d 6
Run Code Online (Sandbox Code Playgroud)
现在我想合并DataFrames并获取每个索引的均值(如果适用,即它是否多次出现).
应该是这样的:
col
a 1
b 3
c 4
d 6
Run Code Online (Sandbox Code Playgroud)
我可以通过一些高级合并/加入来做到这一点吗?
Rom*_*kar 11
这样的事情:
df3 = pd.concat((df1, df2))
df3.groupby(df3.index).mean()
# col
# a 1
# b 3
# c 4
# d 6
Run Code Online (Sandbox Code Playgroud)
或其他方式,如@unutbu回答:
pd.concat((df1, df2), axis=1).mean(axis=1)
Run Code Online (Sandbox Code Playgroud)
In [22]: pd.merge(df1, df2, left_index=True, right_index=True, how='outer').mean(axis=1)
Out[23]:
a 1
b 3
c 4
d 6
dtype: float64
Run Code Online (Sandbox Code Playgroud)
关于 Roman 的问题,我发现IPython的%timeit命令是一种对代码进行基准测试的便捷方法:
In [28]: %timeit df3 = pd.concat((df1, df2)); df3.groupby(df3.index).mean()
1000 loops, best of 3: 617 µs per loop
In [29]: %timeit pd.merge(df1, df2, left_index=True, right_index=True, how='outer').mean(axis=1)
1000 loops, best of 3: 577 µs per loop
In [39]: %timeit pd.concat((df1, df2), axis=1).mean(axis=1)
1000 loops, best of 3: 524 µs per loop
Run Code Online (Sandbox Code Playgroud)
在这种情况下,pd.concat(...).mean(...)结果会更快一些。但实际上我们应该测试更大的数据帧以获得更有意义的基准。
顺便说一句,如果您不想安装 IPython,可以使用Python 的timeit模块运行等效的基准测试。它只需要更多的设置。该文档有一些例子显示如何做到这一点。
请注意,如果df1或df2将在其索引中包含重复条目,例如:
N = 1000
df1 = pd.DataFrame([1,2,3]*N, columns=['col'], index=['a','b','c']*N)
df2 = pd.DataFrame([4,5,6]*N, columns=['col'], index=['b','c','d']*N)
Run Code Online (Sandbox Code Playgroud)
那么这三个答案给出了不同的结果:
In [56]: df3 = pd.concat((df1, df2)); df3.groupby(df3.index).mean()
Out[56]:
col
a 1
b 3
c 4
d 6
Run Code Online (Sandbox Code Playgroud)
pd.merge 可能不会给出你想要的那种答案:
In [58]: len(pd.merge(df1, df2, left_index=True, right_index=True, how='outer').mean(axis=1))
Out[58]: 2002000
Run Code Online (Sandbox Code Playgroud)
虽然pd.concat((df1, df2), axis=1)引发了一个 ValueError:
In [48]: pd.concat((df1, df2), axis=1)
ValueError: cannot reindex from a duplicate axis
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7546 次 |
| 最近记录: |