Python 在数据帧切片中使用all()函数进行筛选
如果我有一个数据帧,例如Python 在数据帧切片中使用all()函数进行筛选,python,pandas,dataframe,Python,Pandas,Dataframe,如果我有一个数据帧,例如 df = pd.DataFrame( { 'one' : pd.Series( [1., 2., 3., 4.], index=['a', 'b', 'c', 'd'] ), 'two' : pd.Series( ['5,6', '7,8', '1,10', '3,8,9'], index=['a', 'b', 'c'
df = pd.DataFrame(
{
'one' : pd.Series(
[1., 2., 3., 4.],
index=['a', 'b', 'c', 'd']
),
'two' : pd.Series(
['5,6', '7,8', '1,10', '3,8,9'],
index=['a', 'b', 'c', 'd']
)
}
)
如何仅选择列2中不包含任何小于3的整数的行?我的目标是:
df[
all([int(x) > 3 for x in df['two'].str.split(',')])
]
但它会抛出
KeyError: True
看着我。有人能帮我吗?
x
是一个字符串列表,您需要添加一个内部循环来遍历x
并检查值:
df[
[all(int(x) > 3 for x in s) for s in df['two'].str.split(',')]
]
# one two
#a 1.0 5,6
#b 2.0 7,8
或者,您可以使用
apply
方法替换外部for循环:
df[
df.two.str.split(',').apply(lambda s: all(int(x) > 3 for x in s))
]
# one two
#a 1.0 5,6
#b 2.0 7,8
x
是字符串列表,您需要添加一个内部循环来遍历x
并检查值:
df[
[all(int(x) > 3 for x in s) for s in df['two'].str.split(',')]
]
# one two
#a 1.0 5,6
#b 2.0 7,8
或者,您可以使用
apply
方法替换外部for循环:
df[
df.two.str.split(',').apply(lambda s: all(int(x) > 3 for x in s))
]
# one two
#a 1.0 5,6
#b 2.0 7,8
为什么我的方法不起作用?我的意思是合乎逻辑。我认为它只是返回一个
True
或False
而没有索引,这就是原因。因为如果您对第一行求值,例如all([int(x)>3表示['5','6']])
=all([True,True])
=True
。我弄错了吗?当你在df.two.str.split(',')中对x做,实际上x是['5','6']
,所以你做的是int(['5','6'])>3
,因为你不能将一个列表转换为int,所以它不起作用。注意df.two.str.split(','))
实际上是一个序列(或列表列表列表)。我明白了,这是因为df.two.str.split(',')
实际上返回一个序列,其值是数组的数组。谢谢为什么我的方法不起作用?我的意思是合乎逻辑。我认为它只是返回一个True
或False
而没有索引,这就是原因。因为如果您对第一行求值,例如all([int(x)>3表示['5','6']])
=all([True,True])
=True
。我弄错了吗?当你在df.two.str.split(',')中对x做,实际上x是['5','6']
,所以你做的是int(['5','6'])>3
,因为你不能将一个列表转换为int,所以它不起作用。注意df.two.str.split(','))
实际上是一个序列(或列表列表列表)。我明白了,这是因为df.two.str.split(',')
实际上返回一个序列,其值是数组的数组。谢谢