我有一段代码如下:
{{1}}
....
这段代码是重复的,我希望循环它们。这个想法是拥有 cal_1、col_2(col2_1、col2_2、col2_3) 和 col_3 的不同顺序的所有组合。返回应该是 a_df 和 b_df 的组合数据帧。
注意:col2_1、col2_2 和 col2_3 可以有不同的顺序,但它们总是彼此相邻。无论如何让这段代码更简单?
答案 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
组合以获得最终结果的双重解包。列在那里被选择并放置在列表的其余部分之前,没有特定的顺序。