想知道解决这个问题的最佳方法是什么
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