Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据帧切片中使用all()函数进行筛选_Python_Pandas_Dataframe - Fatal编程技术网

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(',')
实际上返回一个序列,其值是数组的数组。谢谢