python - 按顺序执行相同的逻辑
问题描述
我有一段代码如下:
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 可以有不同的顺序,但它们总是彼此相邻。无论如何让这段代码更简单?
解决方案
到目前为止,您可以做的是定义要循环的最大迭代次数。到目前为止,您有 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
获得最终结果。列在那里被选择并放置在列表的其余部分之前,没有特定的顺序。
推荐阅读
- oracle - NetSuite:日期之间的差异不包括交易公式的周末
- javascript - 如何使用量角器单击我的单选按钮?
- clojurescript - 使用 goog.dom.animationFrame 递归调用
- python - 用python从嵌套的json中提取
- yii2 - yii2 codeception 不生成单位套装
- python - 在列表理解中并行运行两个列表
- regex - Snort 配置:跨 TCP 数据包的 PCRE 匹配
- scala - 将 Scala 对象作为 Java 对象传递给 Java 方法
- python - 正确使用 create_autospec
- java - 尝试读取二进制保存的整数时 readInt() 不起作用