我有一个“主” Dataframe ,我想只追加匹配列从另一个 Dataframe 排序
df:
A B C
1 2 3
df_to_append:
A B C D E
6 7 8 9 0
问题是,当我使用df.append()
时,它还将不匹配的列追加到df。
df = df.append(df_to_append, ignore_index=True)
Out:
A B C D E
1 2 3 NaN NaN
6 7 8 9 0
但是我想要的输出是删除列D和E,因为它们不是原始 Dataframe 的一部分?也许我需要使用pd.concat
?我不认为我可以使用pd.merge
,因为我没有任何独特的合并。
4条答案
按热度按时间5f0d552i1#
使用
concat
join='inner
w8rqjzmb2#
只需选择两个
df
的公共列:df.append(df_to_append[df.columns], ignore_index=True)
a8jjtwal3#
最简单的方法是使用
df.columns
获取两个 Dataframe 共有的列的列表,但是如果你不知道所有原始列都包含在df_to_append
中,那么你需要找到两个集合的交集:t0ybt7op4#
虽然OP没有明确地这么说(也没有抱怨),但他们提到的 “类似于‘主’数据框” 对我来说意味着结果数据框的列号不应该改变。
BENY和cfort的答案就是这种情况,当且仅当要追加的 Dataframe 的列名保证是原始 Dataframe 列名的严格超集。
只有Eliot K的解决方案确保了原始 Dataframe 的宽度被保留,用
NaN
s填充 Dataframe 中任何缺失的列。如果你遇到了这个问题,就像我一样,那么这就是要走的路。下面我将总结这三种解决方案并展示它们的作用。
准备测试数据
让我们首先创建一些 Dataframe ,从引用 Dataframe 开始:
这看起来像这样:
现在让我们创建一组要追加的 Dataframe :
df_union
:与df
具有完全相同的列df_subset_
:具有df
的一些列,但不是全部df_intersection
:有一些(但不是全部)df
列,还有一些额外的列df_disjoint
:没有df
的列df_superset
:包含df
的所有列和一些附加列我们最终得到每个 Dataframe 的以下列名:
| 数据框架|A|B|C|D|E|F|
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|
|
df
|是的|是的|是的|||||
df_union
|是的|是的|是的|||||
df_subset
|是的|是的||||||
df_intersection
|||是的|是的|是的|||
df_disjoint
||||是的|是的|是的||
df_superset
|是的|是的|是的|是的|是的|是的|现在我们用测试数据
内部连接(BENY)
使用这种策略,我们不能得到比原始 Dataframe 中更多的列,但我们可以得到 * 更少 *(包括根本没有)。
当将每个测试 Dataframe 连接到
df
时,我们会得到df_out
的以下列:| 数据框架|A|B|C|
| --------------|--------------|--------------|--------------|
|
df_union
|是的|是的|是的||
df_subset
|是的|是的|||
df_intersection
|||是的||
df_disjoint
|||||
df_superset
|是的|是的|是的|结论:
*不防止引用数据框收缩
引用数据框cfort只追加列
此解决方案类似于上面的内部连接,但有一个重要的区别:如果要追加的 Dataframe 不包含引用 Dataframe 中的所有列,则该操作将引发
KeyError
。追加以下数据框即可,
df_out
数据框将包含引用数据框中的所有列:| 数据框架|A|B|C|
| --------------|--------------|--------------|--------------|
|
df_union
|是的|是的|是的||
df_superset
|是的|是的|是的|对于以下 Dataframe ,引发
KeyError
:| 数据框架|结果|
| --------------|--------------|
|
df_subset
|KeyError
||
df_intersection
|KeyError
||
df_disjoint
|KeyError
|结论:
KeyError
来防止引用 Dataframe 的收缩。KeyError
可用于处理相对于引用 Dataframe 缺少列的 Dataframe只在 both Dataframe Eliot K中追加列
该解决方案使用与前一个相同的技术方法,但是不是从 Dataframe 中选择以附加参考 Dataframe 的所有列(其可能不可用),而是仅选择在 * 两个 * Dataframe 中可用的那些列。
通过这种方式,解决方案类似于内部连接,但由于
.append()
的行为,结果 Dataframe 无法收缩。相反,缺失的数据将用NaN
s(甚至可能是整行)填充。让我们看看
df_out
的情况:| 数据框架|A|B|C|
| --------------|--------------|--------------|--------------|
|
df_union
|是的|是的|是的||
df_subset
|是的|是的|NaN
||
df_intersection
|NaN
|NaN
|是的||
df_disjoint
|NaN
|NaN
|NaN
||
df_superset
|是的|是的|是的|结论:
NaN
来防止引用 Dataframe 的收缩。备选:追加后选择引用列
与前一个解决方案具有相同行为的解决方案是追加 Dataframe ,然后选择引用 Dataframe 的列 afterwards:
这种解决方案更容易阅读和解析,但在大型操作上性能可能较差。