Enn*_*our 3 python dataframe pandas
我正在尝试从 pandas 数据框中删除所有列,其中该列中的唯一项少于 10 个。但是,我的一些数据是列表,我收到错误unhashable type: 'list'。这是有道理的,因为 pandas 与哈希图进行比较。
我当前的代码是
for i in df.columns:
if len(df[i].unique()) < 10:
df.drop(i, 1)
Run Code Online (Sandbox Code Playgroud)
在我到达列表对象之前,它工作得很好。就我的目的而言, list1 和 list2 不是唯一的。[1, 2]并且[2, 1]不是唯一的,尽管[1, 2] == [2, 1]是 False 。
我应该如何执行此操作?分隔列表没有意义,而且我无法显式键入列,因为我有 1400 个列。
提前谢谢了!
list对象不可散列,因为它们是可变的,但tuple另一方面,它们是不可变的。您可以transform列出值tuple并使用此属性。
假设你有
df = pd.DataFrame({"A": [1,2,3,4],
"B": ["a", "b", "c", "d"],
"C": [[1,2,3], [2], [2,3,1], [4]] })
A B C
0 1 a [1, 2, 3]
1 2 b [2]
2 3 c [2, 3, 1]
3 4 d [4]
Run Code Online (Sandbox Code Playgroud)
因此,你可以做类似的事情
df.C.apply(sorted).transform(tuple).unique()
Run Code Online (Sandbox Code Playgroud)
返回
array([(1, 2, 3), (2,), (4,)], dtype=object)
Run Code Online (Sandbox Code Playgroud)
因此,您的代码可能如下所示,用于collections.Hashable检查列的内容是否确实可散列
import collections
for i in df.columns:
if isinstance(df[i].iloc[0], collections.Hashable):
if len(df[i].unique()) < 10:
df = df.drop(i, 1)
else:
if len(df[i].apply(sorted).transform(tuple).unique()) < 10:
df = df.drop(i, 1)
Run Code Online (Sandbox Code Playgroud)
请注意,这也适用于其他不可散列的类型,例如dicts
>>> df["D"] = [{"a":2}, {}, {"k":3}, {"k":3}]})
>>> print(df.D.apply(sorted).transform(tuple).unique())
[('a',) () ('k',)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6924 次 |
| 最近记录: |