pandas 为什么python跳过elif语句

jgovgodb  于 2023-06-20  发布在  Python
关注(0)|答案(2)|浏览(195)

我试图做的是让用户输入一组用空格分隔的值,读取它们,与数据框进行正确的比较,并相应地打印文本。看起来很简单的任务,却经过了数小时的努力。奇怪的是:

  1. else语句本身工作正常,但其格式与if语句不同
    1.如果语句格式似乎正确,但它不正确工作。无论我输入什么,它总是打印出“所有数字都在数据框中”。
    1.永远无法识别elif语句
    我将input str转换为list,可以在代码示例中看到。这显然与数据类型无关。任何帮助将非常感谢!
import pandas as pd

in1 = input("Choose certain numbers separated with spaces:")
in1 = in1.strip()

result = pd.DataFrame([1, 1, 1, 2, 3, 3, 4, 5], columns=['Numbers'])

uniq_numbers = list(result.Numbers.unique())

print(type(in1))
in1 = in1.split()
for i in range(len(in1)):
    in1[i] = int(in1[i])
print(type(in1))

if all(result[(result['Numbers'].isin([in1]))]):
    print('All numbers', in1, ' are in dataframe:', uniq_numbers)
elif not all(result['Numbers'].isin(in1)):
    print('No numbers', in1, ' were found in dataframe!', uniq_numbers)
else:
    print('Some of the numbers entered:', in1, 'are NOT in dataframe, be aware. \n',
     'Valid number/s:',
     set(in1).intersection(result),
     '\n Number/s that were NOT found in dataframe:',
     (set(in1) - set(result))
          )

输入:6 7输出:所有数字都在dataframe ['6',' ','7']中

aiazj4mn

aiazj4mn1#

有两个主要问题。您不是在测试列表中的所有数字是否都在数据框中,而是在测试数据框中的所有数字是否都在列表中。if语句的问题在于,作为all函数的参数,您使用的不是bool s的可迭代对象,而是一个对象,在本例中是 Dataframe 。
要测试列表中的所有数字是否都在数据框中,可以使用numpy

import numpy as np
import pandas as pd

result = pd.DataFrame([1, 1, 1, 2, 3, 3, 4, 5], columns=['Numbers'])
numbers = [1, 3, 5]
mask = np.isin(numbers, result['Numbers'].unique())

if np.all(mask):
    print('All numbers present')
elif not np.any(mask):
    print('None numbers present')
else:
    print('Some numbers present')

要知道列表中的哪些数字出现在数据框中,可以使用mask变量。如果mask[i]True,则 Dataframe 中存在编号numbers[i]。如果你把数字转换成numpy数组,你可以简单地得到所有当前的数字

numbers_present = np.array(numbers)[mask]

这是可能的,因为您可以使用bool s索引numpy数组。

holgip5t

holgip5t2#

请尝试以下操作:我想这会解决你的问题:

import pandas as pd

in1 = input("Choose certain numbers separated with spaces:")
in1 = in1.strip()

result = pd.DataFrame([1, 1, 1, 2, 3, 3, 4, 5], columns=['Numbers'])

uniq_numbers = list(result.Numbers.unique())

print(type(in1))
in1 = in1.split()
for i in range(len(in1)):
    in1[i] = int(in1[i])
print(type(in1))

in1_set = set(in1)
uniq_numbers_set = set(uniq_numbers)

if in1_set.issubset(uniq_numbers_set):
    print('All numbers', in1, ' are in dataframe:', uniq_numbers)
elif not in1_set.intersection(uniq_numbers_set):
    print('No numbers', in1, ' were found in dataframe!', uniq_numbers)
else:
    print('Some of the numbers entered:', in1, 'are NOT in dataframe, be aware. \n',
     'Valid number/s:',
     in1_set.intersection(uniq_numbers_set),
     '\n Number/s that were NOT found in dataframe:',
     in1_set - uniq_numbers_set
          )

在这个修正的代码中,我们将in1uniq_numbers转换为集合,并使用issubset方法检查in1中的所有数字是否都在DataFrame中。我们还使用intersection方法来检查in1中的任何数字是否在DataFrame中。

相关问题