根据每个数据帧中的条件有选择地组合多个数据帧
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),首先将 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
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
我有三个不同的基于时间的数据帧,其中有 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),首先将 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
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