我想确定 pandas 中的列是否是列表(每行)。
df=pd.DataFrame({'X': [1, 2, 3], 'Y': [[34],[37,45],[48,50,57]],'Z':['A','B','C']})
df
Out[160]:
X Y Z
0 1 [34] A
1 2 [37, 45] B
2 3 [48, 50, 57] C
df.dtypes
Out[161]:
X int64
Y object
Z object
dtype: object
由于字符串的数据类型是“对象”,因此我无法区分字符串列和列表(整数或字符串)。
如何识别“Y”列是一个 int 列表?
您可以使用 [
map
[(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.map.html) (或 applymap
for pandas 版本之前) 2.1.0),比较然后添加 all
以检查所有值是否都是 True
s:
print (df.map(type))
X Y Z
0 <class 'int'> <class 'list'> <class 'str'>
1 <class 'int'> <class 'list'> <class 'str'>
2 <class 'int'> <class 'list'> <class 'str'>
a = (df.map(type) == list).all()
print (a)
X False
Y True
Z False
dtype: bool
或者:
a = df.map(lambda x: isinstance(x, list)).all()
print (a)
X False
Y True
Z False
dtype: bool
如果需要列列表:
L = a.index[a].tolist()
print (L)
['Y']
dtypes
(但strings
、list
、dict
是object
):
print (df.dtypes)
X int64
Y object
Z object
dtype: object
a = df.dtypes == 'int64'
print (a)
X True
Y False
Z False
dtype: bool
如果您的数据集很大,您应该在应用 type 函数之前采样,然后您可以检查:
如果最常见的类型是list:
df\
.sample(100)\
.applymap(type)\
.mode(0)\
.astype(str) == "<class 'list'>"
如果所有值都是列表:
(df\
.sample(100)\
.applymap(type)\
.astype(str) == "<class 'list'>")\
.all(0)
如果有任何值是 list:
(df\
.sample(100)\
.applymap(type)\
.astype(str) == "<class 'list'>")\
.any(0)