循环遍历python数组以匹配第二个数组中的多个条件,快速方法?
Posted
技术标签:
【中文标题】循环遍历python数组以匹配第二个数组中的多个条件,快速方法?【英文标题】:Looping through python array to match multiple conditions from second array, fast method? 【发布时间】:2017-09-09 19:38:40 【问题描述】:我是 Python 的初学者,想知道是否有更快的方法来编写此代码,所以请原谅我的无知。我有 2 张 excel 表格:一张(results)有大约 30,000 行唯一用户 ID,然后我有 30 列问题被问到,下面的单元格是空的。我的第二张表(answers)有大约 400,000 行和 3 列。第一列是用户 ID,第二列是提出的问题,第三列是用户对每个相应问题的答案。我想要做的本质上是一个索引匹配数组 excel 函数,我可以通过匹配用户 ID 和所问的问题来填充表 1 中的空白单元格和表 2 中的答案。
现在我编写了一段代码,但仅处理工作表 1 中的 4 列就需要大约 2 小时。我试图弄清楚我的做法是否没有充分利用 Numpy 功能。
import pandas as pd
import numpy as np
# Need to take in data from 'answers' and merge it into the 'results' data
# Will requiring matching the data based on 'id' in column 1 of 'answers' and the
# 'question' in column 2 of 'answers'
results = pd.read_excel("/Users/data.xlsx", 'Results')
answers = pd.read_excel("/Users/data.xlsx", 'Answers')
answers_array = np.array(answers) #########
# Create a list of questions being asked that will be matched to column 2 in answers.
# Just getting all the questions I want
column_headers = list(results.columns)
formula_headers = [] #########
for header in column_headers:
formula_headers.append(header)
del formula_headers[0:13]
# Create an empty array with ids in which the 'merged' data will be fed into
pre_ids = np.array(results['Id'])
ids = np.reshape(pre_ids, (pre_ids.shape[0], 1))
ids = ids.astype(str)
zero_array = np.zeros((ids.shape[0], len(formula_headers)))
ids_array = np.hstack((ids, zero_array)) ##########
for header in range(len(formula_headers)):
question_index = formula_headers[header]
for user in range(ids_array.shape[0]):
user_index = ids_array[user, 0]
location = answers_array[(answers_array[:, 0] == int(user_index)) & (answers_array[:, 1] == question_index)]
# This location formula is what I feel is messing everything up,
# or could be because of the nested loops
# If can't find the user id and question in the answers array
if location.size == 0:
ids_array[user][header + 1] = ''
else:
row_location_1 = np.where(np.all(answers_array == location[0], axis=1))
row_location = int(row_location_1[0][0])
ids_array[user][header + 1] = answers_array[row_location][2]
print ids_array
【问题讨论】:
【参考方案1】:我们可以只旋转第二个数据帧,而不是使用第二个数据帧的信息填充第一个数据帧。
answers.set_index(['id', 'question']).answer.unstack()
如果您需要与results
数据框中的行和列相同,可以添加reindex_like
方法
answers.set_index(['id', 'question']).answer.unstack().reindex_like(results)
如果你有重复
cols = ['id', 'question']
answers.drop_duplicates(cols).set_index(cols).answer.unstack()
【讨论】:
嗯,问题在于答案表中的第 1 列有重复的用户 ID 来说明他们对每个问题的回答 @MiriamAlh 是的,这就是我在id
和question
上设置索引的原因
@MiriamAlh 你有我可以演示的示例数据吗?谈论我看不到的数据集非常困难。
刚刚用工作表示例的 sn-ps 编辑了我的问题。我试过你的代码,但我得到了这个错误:ValueError: Index contains duplicate entries, cannot reshape
@MiriamAlh 这意味着您的答案数据框中有重复的 id 和 question 组合。你期待吗?您想如何处理重复项?保持第一?最后的?没有?以上是关于循环遍历python数组以匹配第二个数组中的多个条件,快速方法?的主要内容,如果未能解决你的问题,请参考以下文章