根据细胞类型过滤pandas数据帧

2024-09-28 05:19:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由openstreetmap数据生成的geodataframe。我对其中一个列有一个问题,它返回objectdtype,包含字符串和列表的混合,如下面的highway列所示。在

    access geometry                                         highway
0   NaN LINESTRING (-10817.60510122531 6680340.0880667...   footway
1   no  LINESTRING (-11843.46986863073 6678698.1663396...   footway
2   no  LINESTRING (-11843.46986863073 6678698.1663396...   [footway, steps]
3   no  LINESTRING (-11843.46986863073 6678698.1663396...   footway
4   NaN LINESTRING (-9727.497855683101 6679963.0804682...   unclassified

我试图获取highway列的唯一值,但是unique()函数返回TypeError: unhashable type: 'list'错误。我理解为什么会发生这种情况,但我不确定如何真正获得唯一值。我在考虑按单元格数据类型过滤数据帧,类似于

dfMultitags = df[type(df['highway']) == type(list()]

但我似乎也找不到办法。欢迎有任何想法。在

编辑: 这个问题与包含不规则列表的pandas列有关,来自Group operations on Pandas column containing lists的解决方案在这里并不适用。答案是将列表转换为元组。在我的案例中,结果如下:

^{pr2}$

理想情况下,我希望将初始数据帧拆分为两个数据帧,一个包含list类型的所有单元格,另一个包含具有str值的所有单元格。在


Tags: 数据nodf列表objecttype情况nan
2条回答

您可以使用astype转换为str,然后使用duplicated来自@chrisz的数据

df[~df.type.astype(str).duplicated(keep='first')]
Out[75]: 
              type
0  [highway, road]
1          highway
2    [road, other]

您可以使用apply()只将列表转换为元组,而其余部分保持不变,然后调用unique()

In [15]: df = pd.DataFrame({'highway': ['footway', 'footway', ['footway', 'steps'], 'footway', 'unclassified']})

In [16]: df['highway'].apply(lambda x: tuple(x) if isinstance(x, list) else x).unique()
Out[16]: array(['footway', ('footway', 'steps'), 'unclassified'], dtype=object)

如果将tuple()应用于整个列,则它将字符串转换为每个字符的元组。在

相关问题 更多 >

    热门问题