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

Selectively Combine several dataframes based on conditions in each dataframe

我有三个不同的基于时间的数据帧,其中有 10 多个数据点。

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

我想将这些数据帧合并为 1 个数据帧,仅当它们存在相同的时间点时。在上面的数据帧中,只有时间 3 和 5 同时存在于所有三个数据帧中,因此将这些数据点合并到最终数据帧中。

df4['time']  = 3, 5
df4['data1'] = 0, 0
df4['data2'] = b, c
df4['data3'] = z, x

我一直在尝试避免使用 if 语句迭代数据帧,因为数据点众多,而来自 cs95 的 How to iterate over rows in a DataFrame in Pandas 中的答案基本上是说尽可能避免迭代。

我是否卡住了遍历数据帧,或者是否有 vectorization/list 我可以遵循的理解方法?

您想使用 pd.merge。我认为它就像一个 SQL 连接,它的工作原理非常相似。在下面的示例中,我正在执行 2 次合并(a.k.a.joins),首先将 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 join 仅保留存在于两个数据框中的值。 on 字段指示需要匹配哪些列才能加入。

请注意,如果您的列在数据集中具有相同的名称并且是未包含在 on 中,则它们将分别重命名为 _df1_df2_df3

你想要time在所有三个DataFrame中的交集,这可以通过在'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