按顺序执行相同的逻辑

时间:2021-01-08 20:13:55

标签: python loops

我有一段代码如下:

{{1}}

....

这段代码是重复的,我希望循环它们。这个想法是拥有 cal_1、col_2(col2_1、col2_2、col2_3) 和 col_3 的不同顺序的所有组合。返回应该是 a_df 和 b_df 的组合数据帧。

注意:col2_1、col2_2 和 col2_3 可以有不同的顺序,但它们总是彼此相邻。无论如何让这段代码更简单?

1 个答案:

答案 0 :(得分:0)

到目前为止您可以做的是定义要循环的最大迭代次数。到目前为止,您有 5 列可以循环。

list_columns = ['col1', 'col2_1', 'col2_2', 'col2_3', 'col3']
print(len(list_columns)) # returns 5

然后,您可以根据要放入数据框中的内容定义列名称。假设您要进行 5 次迭代。您的列名称将是 ['A', 'B', 'C', 'D', 'E']。这是您的数据框的 column 参数。一次连接多个列的更简单方法是先创建一个字典每个列名是键,并且每个列都有一个大小相同的列表作为价值

list_columns = ['col1', 'col2_1', 'col2_2', 'col2_3', 'col3']
new_columns = ['A', 'B', 'C', 'D', 'E']

# Use a dictionary comprehension in my case
data_dict = {column: [] for column in new_columns}

n = 50 # Assume the number of loops is arbitrary there

for i in range(n):
    for col in new_columns:
        # do something
        data_dict[col].append(something)
    

在您的情况下,您似乎可以通过提供 NumPy 数组来直接对列表进行操作。因此:

list_cols = ['col1', 'col2_1', 'col2_2', 'col2_3', 'col3']
new_cols = ['A', 'B', 'C', 'D', 'E']
data_df = {}

for i, (col, new_col) in enumerate(zip(list_cols, new_cols)):
  print(col, list_cols[0:i] + list_cols[i+1:])
  temp_df = df[[col] + list_cols[0:i] + list_cols[i+1:]]
  temp_indices = np.argmax(temp_df.ne(0).values, axis=1) 
  data_df[new_col] = b.values[np.arange(len(temp_df)), temp_indices]

final_df = pd.DataFrame(data_df)

我所做的基本上是将 enumerate 组合起来获得索引和 zip 组合以获得最终结果的双重解包。列在那里被选择并放置在列表的其余部分之前,没有特定的顺序。