我有三个不同的基于时间的数据帧,其中包含成千上万的数据点。
df1['time'] = 1, 2, 3, 4, 5
df1['data1'] = 1, 0, 0, 1, 0
df2['time'] = 1, 3, 5, 7, 9
df2['data2'] = a, b, c, d, e
df3['time'] = 3, 4, 5, 6, 7
df3['data3'] = z, y, x, w, v
我想将这些数据帧合并为一个数据帧,仅当它们存在相同的时间点时。在上面的数据帧中,只有时间3和5同时存在于所有三个数据帧上,因此将这些数据点合并到最终数据帧中。
df4['time'] = 3, 5
df4['data1'] = 0, 0
df4['data2'] = b, c
df4['data3'] = z, x
我一直在努力避免使用if语句对数据帧进行迭代,因为有很多数据点,而且cs95中Pandas中"如何在数据帧中对行进行迭代"的答案基本上是说尽可能避免迭代。
我是在迭代数据帧,还是有矢量化/列表理解方法可以遵循?
您想要使用pd.merge
。我认为它就像一个SQL联接,它的工作原理非常相似。在下面的示例中,我正在进行两次合并(也称为联接(,首先使用df1
到df2
作为时间列上的内部联接,然后再次使用内部联接将合并后的数据帧与df3
在时间上合并。
import pandas as pd
df1 = pd.DataFrame({'time': [1,2,3,4,5], 'data1': [1,0,0,1,0]})
df2 = pd.DataFrame({'time': [1,3,5,7,9], 'data2': ['a','b','c','d','e']})
df3 = pd.DataFrame({'time': [3,4,5,6,7], 'data3': ['z','y','x','w','v']})
df4 = df1.merge(df2, how='inner', on='time').merge(df3, how='inner', on='time')
df4
Out[211]:
time data1 data2 data3
0 3 0 b z
1 5 0 c x
inner
联接仅保留存在于两个数据帧中的值。CCD_ 6字段指示哪个列需要匹配以加入。
请注意,最终结果将包括每个列中的data1
、data2
和data3
,如果数据集中有相同名称的列,但不包括在on
中,则它们将分别用_df1
、_df2
和_df3
重命名。
您想要time
在所有三个DataFrames中的交集,这可以通过对'time
进行内部合并来处理。默认情况下,merge
执行内部合并,因此您可以简单地使用:
out = df1.merge(df2, on='time').merge(df3, on='time')
输出:
time data1 data2 data3
0 3 0 b z
1 5 0 c x
您也可以使用pd.concat
:
import pandas as pd
df1 = pd.DataFrame({'time': [1,2,3,4,5], 'data1': [1,0,0,1,0]})
df2 = pd.DataFrame({'time': [1,3,5,7,9], 'data2': ['a','b','c','d','e']})
df3 = pd.DataFrame({'time': [3,4,5,6,7], 'data3': ['z','y','x','w','v']})
pd.concat([df.set_index('time') for df in [df1, df2, df3]],
axis=1,
join='inner').reset_index()
它给出:
time data1 data2 data3
0 3 0 b z
1 5 0 c x