首页 > 解决方案 > 按顺序执行相同的逻辑

问题描述

我有一段代码如下:

a = df[['col1', 'col2_1', 'col2_2', 'col2_3', 'col3]]
a_indices = np.argmax(a.ne(0).values, axis=1)
a_df = pd.DataFrame(a.values[np.arange(len(a)), a_indices])

b = df[['col2_1', 'col2_2', 'col2_3', 'col3', 'col1]]
b_indices = np.argmax(b.ne(0).values, axis=1)
b_df = pd.DataFrame(b.values[np.arange(len(b)), b_indices])

……

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

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

标签: pythonloops

解决方案


到目前为止,您可以做的是定义要循环的最大迭代次数。到目前为止,您有 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获得最终结果。列在那里被选择并放置在列表的其余部分之前,没有特定的顺序。


推荐阅读