首页 > 解决方案 > 熊猫:如何选择数据框类型为列表的列?

问题描述

我有一个 pandas 数据框,其中一些列是 type list。我所有的列都是相同的类型(或者所有元素都是列表或不是)。如何只选择这些列?

如果我得到dtypes它们都是对象类型:

In [44]: df = pd.DataFrame([['a', [1,2]], ['b', [3,4]]], columns=['x', 'y'])

In [45]: df
Out[45]: 
   x       y
0  a  [1, 2]
1  b  [3, 4]

In [46]: df.dtypes
Out[46]: 
x    object
y    object
dtype: object

标签: pandasdataframe

解决方案


您可以编写自己的函数来指定列是否包含所有列表:

def all_lists(array):
    return all(isinstance(x, list) for x in array)

list_types = df.apply(all_lists)

print(list_types)
x    False
y     True
dtype: bool

然后使用list_types系列对我们的数据进行子集化:

list_type_subset = df.loc[:, list_types]

print(list_type_subset)
        y
0  [1, 2]
1  [3, 4]

一些重要的注意事项:

  • 如果您有一个巨大的数据框,检查每个值是否是一个列表对象可能会很耗时,因为我们正在迭代每个值并手动检查。
  • list不是实际dtype的 - 当dtype不是数字、布尔值、日期时间或其他官方"object"时,dtype 本质上是 pandas 使用的统称。这就是为什么我们必须以稍微迂回的方式做事。dtypedtype

推荐阅读