将Pandas DF中的意外列移动到新DF的最佳方法



想知道解决这个问题的最佳方法是什么

df1()
type_of_fruit   name_of_fruit    price
.....           .....            .....

以及一个名为的列表

expected_cols = ['name_of_fruit','price']

根据预期cols列表自动检查df1的最佳方法是什么?我在尝试类似的东西

df_cols=df1.columns.values.tolist()
if df_cols != expected_cols:

然后尝试将不在expected_cols中的任何列放到另一个df中,但这对我来说似乎不是一个好主意;丢弃";列?

df2 = df1.drop(columns=expected_cols)

但这似乎是有问题的,这取决于列的顺序,也取决于列可能比预期值多或比预期值少的情况。在值少于预期的情况下(即df1只包含列名_of_fuit(,我计划使用

df1.reindex(columns=expected_cols)

但对于如何用程序实现这一点,以及如何处理列数超过预期的问题,有点不确定。

您可以使用-:使用set difference

假设df1具有cols:

In [542]: df1_cols = df1.columns # ['type_of_fruit', 'name_of_fruit', 'price']
In [539]: expected_cols = ['name_of_fruit','price']
In [541]: unwanted_cols = list(set(d1_cols) - set(expected_cols))
In [542]: df2 = df1[unwanted_cols]
In [543]: df1.drop(unwanted_cols, 1, inplace=True)

沿列轴使用groupby可以简洁地拆分DataFrame。在这种情况下,检查列是否在您的列表中以形成分组器,您可以将结果存储在dict中,其中True键获得具有列表中列的子集的DataFrame,而False键具有不在列表中的列的子集。

示例数据

import pandas as pd
df = pd.DataFrame(data = [[1,2,3]],
columns=['type_of_fruit', 'name_of_fruit', 'price'])
expected_cols = ['name_of_fruit','price']

代码

d = dict(tuple(df.groupby(df.columns.isin(expected_cols), axis=1)))
# If you need to ensure columns are always there then do
#d[True] = d[True].reindex(expected_cols)
d[True]
#   name_of_fruit  price
#0              2      3
d[False]
#   type_of_fruit
#0              1

最新更新