【问题标题】:How to adjust for loop so that it prints list only once?如何调整 for 循环使其仅打印一次列表?
【发布时间】:2020-11-19 11:19:33
【问题描述】:

我有一些示例代码如下:

import numpy as np
import pandas as pd

x = range(1, 12)
arr1 = np.random.randint(x)
arr2 = np.array(x)
arr3 = np.random.randint(x)
arr4 = np.random.randint(x)
arr5 = np.random.randint(0, 2, 11)

dict_df = {
    'arr1' : arr1,
    'arr2' : arr2,
    'arr3' : arr3,
    'arr4' : arr4,
    'arr5' : arr5
}
d = pd.DataFrame(dict_df)

num_count = 0
list_of_num = []
for i in d.index:
    number = d['arr1'][i]
    for num in d['arr5']:
        if num == 1:
            num_count = 1
            number = number
            list_of_num.append(number)
        elif num == 0:
            num_count = 0
print(list_of_num)

我正在尝试构建列表,如果arr5 列中的所有列表前面都带有-1,则它们会被附加到列表中。我从中收到的输出是:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, 8, 8]

代码的问题是我误用了for 循环,这就是为什么列表重复了这么多次。如何更改代码以使代码不会重复?

【问题讨论】:

  • 你能显示预期的输出吗?也许先在你的 rng 中设置一个种子,或者只打印输入数组。你用num_count 做什么?你的意思是使用+=1(在这种情况下你不需要+=0。你是什么意思“前面有-1”?所有的数组都是非负数...

标签: python pandas numpy dataframe for-loop


【解决方案1】:

看来您并不打算嵌套循环。外循环遍历每一行。然后,对于外循环的每次迭代,内循环遍历每一行。要同步移动两列,您可以编写一个循环:

for i in d.index:
    if d['arr5'][i]:
        list_of_num.append(d['arr1'][i])
        num_count += 1

这当然是极其低效的,并且首先放弃了使用 numpy 或 pandas 的所有好处。您可以使用布尔掩码完成同样的事情。在 numpy 中:

array_of_num = arr1[arr5.astype(bool)]
num_count = array_of_num.size

在熊猫中:

series_of_num = d['arr1'][d['arr5'].astype(bool)]
num_count = series_of_num.size

在这两种情况下,您都可以将.astype(bool) 替换为!= 0

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2013-09-16
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多