【发布时间】:2021-03-28 15:03:48
【问题描述】:
考虑两个 DataFrame:
>>> df1 = pd.DataFrame({'key': [1, 2, 3, 4, 5],
'bar': ['w','x','y','z','h'],
'foo': ['A', 'B', 'C', 'D','E']})
>>> df2 = pd.DataFrame({'key': [1, 2, 3, 8, 9, 10],
'foo': [np.nan, np.nan, np.nan, 'I','J','K']})
假设我们想在 'key' 上加入 DataFrame,以便只返回 df1 中的键,除了 df2 中大于 8 的键。您可以这样做
- 首先通过
df3 = pd.merge(df1,df2,on='key',how='left')进行左连接 - 然后,通过
df4 = pd.merge(df3,df2.loc[df2['key']>8],on='key',how='outer')与 df2 切片进行外连接
但是,不是在每个 DataFrame 中对齐列 'foo',而是将每个“foo”列作为离散列添加到 df4,并添加后缀以区分它们。而且,需要几行代码来组合三个'foo' 列,这样我就有一个只有一个'foo' 列的DataFrame。有没有更简洁的方法来做到这一点?
编辑:
我想我的例子掩盖了真正的问题。让我们使用这些 DataFrame:
>>> df1 = pd.DataFrame({'key': [1, 2, 3, 4, 5],
'bar': ['w','x','y','z','h'],
'foo': [np.nan, np.nan, 'C', 'D','E'],})
>>> df2 = pd.DataFrame({'key': [1, 2, 3, 8, 9, 10],
'foo': ['A', 'B', np.nan, 'I','J','K']})
如果我如上所述使用左连接然后外连接,我会得到这个...
key bar foo_x foo_y foo
0 1 w NaN A NaN
1 2 x NaN B NaN
2 3 y C NaN NaN
3 4 z D NaN NaN
4 5 h E NaN NaN
5 9 NaN NaN NaN J
6 10 NaN NaN NaN K
因为合并三个'foo' 列将需要很多行代码,我想知道是否有更简洁的方法来完成这一切。也就是说,合并两个 DataFrame 并合并 'foo' 列,使得返回的 DataFrame 是这样的:
key bar foo
0 1 w A
1 2 x B
2 3 y C
3 4 z D
4 5 h E
5 9 NaN J
6 10 NaN K
【问题讨论】: