我有一个从openstreetmap数据生成的地理数据框。我的其中一个列存在问题,该列返回dtype
object
个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()]
错误。我理解为什么会发生这种情况,但我不确定如何实际获得独特的价值观。我正在考虑按单元格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
个值的所有单元格。
答案 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]