Python 如果数据类型为元组,如何筛选数据帧?
我有一个数据帧,出于某种原因,这个数据帧的数据类型是tuple 让我举一个例子:Python 如果数据类型为元组,如何筛选数据帧?,python,pandas,Python,Pandas,我有一个数据帧,出于某种原因,这个数据帧的数据类型是tuple 让我举一个例子: In [13]: df = pd.DataFrame(np.reshape(range(25), (5,5))) In [15]: df[3] = [(1,2), (2,3), (4,5), (1,2), (-1, 1)] In [16]: df Out[16]: 0 1 2 3 4 0 0 1 2 (1, 2) 4 1 5 6 7 (2, 3
In [13]: df = pd.DataFrame(np.reshape(range(25), (5,5)))
In [15]: df[3] = [(1,2), (2,3), (4,5), (1,2), (-1, 1)]
In [16]: df
Out[16]:
0 1 2 3 4
0 0 1 2 (1, 2) 4
1 5 6 7 (2, 3) 9
2 10 11 12 (4, 5) 14
3 15 16 17 (1, 2) 19
4 20 21 22 (-1, 1) 24
我想保持那些第一个元素大于1的行
也就是说,预期结果是:
In [20]: df.loc[[1, 2]]
Out[20]:
0 1 2 3 4
1 5 6 7 (2, 3) 9
2 10 11 12 (4, 5) 14
有什么好方法吗?可以使用pandas.DataFrame.aggregate()和lambda函数作为参数。这将返回tuple的第一个元素
import pandas as pd
import numpy as np
df = pd.DataFrame(np.reshape(range(25), (5,5)))
df[3] = [(1,2), (2,3), (4,5), (1,2), (-1, 1)]
df1=df[df[3].aggregate(lambda x:x[0])>1]
print(df1)
可以访问列表、元组中的元素,而不仅仅限于字符串:
df.loc[df[3].str[0] > 1]
0 1 2 3 4
1 5 6 7 (2, 3) 9
2 10 11 12 (4, 5) 14
试试看:
df.loc[df[3].str[0]>1]
@sammywemmy的评论是正确的方法。最快最干净。此外,尽管命名为.str
方法,但在这种情况下,df[3].str[0].dtypes
实际上是int64
,因此比较是正确的,而且速度非常快。请把它作为答案贴出来。这是正确的。顺便说一句,我经常使用df.applymap(type)
检查所有单元格的实际类型(特别是对于在df.dtypes
中仅显示为'object'
的列)。在本例中,您可以验证col 3的所有值是否都是具有(df.applymap(type)=tuple.all()[3]
的元组。