我试图通过在列表列表中查找值并尝试查找列/索引匹配来填充数据框。我找到了这篇文章,并认为我可以根据需要对其进行修改。 fill in entire dataframe cell by cell based on index AND column names?。他使用edit_distance函数填写了熊猫数据框。我目前正在尝试修改该功能,以便它输出实际数据。
我的数据集看起来像这样,但具有更多的值:
Data = [Product Number, Date, Quantity]
[X1 , 2018-01, 2]
[X1, , 2018-02, 4]
[X1, , 2018-03, 7]
[X2, , 2018-01, 3]
[X3, , 2018-02, 5]
[X3, , 2018-03, 6]
预期结果:粗略表示歉意
DF = 2018-01 2018-02- 2018-03
X1 2 4 7
X2 3
X3 5 6
我将列表中的所有产品编号和日期都删除了重复数据,并将它们设置为与以下相同,就像他在引用的堆栈问题中所做的一样。
series_rows = pd.Series(prod_deduped)
series_cols = pd.Series(dates_deduped)
他用于映射所有单元格的代码:
df = pd.DataFrame(series_rows.apply(lambda x: series_cols.apply(lambda y: edit_distance(x, y))))
以edit_distance开头的部分是根据x,y的输入返回值的函数。我创建了自己的函数,该函数将遍历列表列表并根据匹配结果返回一个值。
def return_value(s1, s2, list_of_lists, starting_point_in_case_of_header):
for row in list_of_lists[starting_point_in_case_of_header:]:
result = ''
product = row[0]
date = row[1]
quantity = row[2]
#for prod in product:
if product == s1 and date == s2:
result = quantity
return result
我在第1列,第1列上有一个匹配项,但其他所有内容均为空白,这使我认为我真的需要先遍历s1或s2。任何帮助,将不胜感激。谢谢!
编辑:这是我最近的尝试遍历s1和s2的尝试,但这只是说我的列表索引超出范围而出错。我认为我的步伐正确。
def return_value(s1, s2, list_of_lists, starting_point_in_case_of_header):
for y in enumerate(s2):
result_ = []
for x in enumerate(s1):
for row in list_of_lists[starting_point_in_case_of_header:]:
product = row[0]
date = row[1]
quantity = row[2]
if product == x and date == y:
result_.append(quantity)
result = result_
return result[-1]
我的最终代码将所有内容放在一起:
result_df = pd.DataFrame(series_rows.apply(lambda x: series_cols.apply(lambda y: return_value(x, y, sorted_deduped_list, 0))))