按单元格类型过滤pandas数据帧

时间:2018-04-20 14:49:05

标签: python python-3.x pandas geopandas

我有一个从openstreetmap数据生成的地理数据框。我的其中一个列存在问题,该列返回dtype objecthighway,其中包含字符串和列表的混合,如下面的 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()]错误。我理解为什么会发生这种情况,但我不确定如何实际获得独特的价值观。我正在考虑按单元格dtype过滤数据框,类似于

0 (f, o, o, t, w, a, y) 1 (f, o, o, t, w, a, y) 2 (footway, steps) 3 (f, o, o, t, w, a, y) 4 (u, n, c, l, a, s, s, i, f, i, e, d) 5 (u, n, c, l, a, s, s, i, f, i, e, d) 6 (f, o, o, t, w, a, y)

但我似乎无法找到办法。欢迎任何想法。

修改 此问题更多地与包含不规则列表的pandas列有关,来自Group operations on Pandas column containing lists的解决方案不适用于此处。答案是将列表转换为元组。在我的情况下,这导致以下结果:

list

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

2 个答案:

答案 0 :(得分:1)

您可以使用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()应用于整个列,它会将字符串转换为每个字符的元组。

答案 1 :(得分:0)

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

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