根据每个数据帧中的条件选择性地组合多个数据帧



我有三个不同的基于时间的数据帧,其中包含成千上万的数据点。

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联接,它的工作原理非常相似。在下面的示例中,我正在进行两次合并(也称为联接(,首先使用df1df2作为时间列上的内部联接,然后再次使用内部联接将合并后的数据帧与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字段指示哪个列需要匹配以加入。

请注意,最终结果将包括每个列中的data1data2data3,如果数据集中有相同名称的列,但不包括在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

最新更新