【发布时间】:2020-10-19 08:56:53
【问题描述】:
我正在尝试实现一个循环遍历字典的 for 循环。该字典具有从 csv 文件中提取的值。某些行的某些值丢失。我正在考虑做的是取上一个和最近的可用下一个条目的平均值并将其分配给字典。有时连续行缺少列值。
这是一个例子:
input.csv:
Date,Column_1,Column_2,Column_3
2020-06-26,1,3,5
2020-06-27,2,,4
2020-06-28,5,,6
2020-06-29,7,8,10
预期的行为是:
输出.csv:
Date,Column_1,Column_2,Column_3
2020-06-26,1,3,5
2020-06-27,2,5.5,4
2020-06-28,5,6.75,6
2020-06-29,7,8,10
(3 + 8) / 2 = 5.5
(5.5 + 8) / 2 = 6.75
这是我试过的:
def neighborhood(iterable):
iterator = iter(iterable)
previous_item = None
current_item = next(iterator)
for next_item in iterator:
yield previous_item, current_item, next_item
previous_item = current_item
current_item = next_item
yield previous_item, current_item, None
dictionary = {
'2020-06-26': {'Date': '2020-06-26', 'Column_1': 1, 'Column_2': 3, 'Column_3': 5},
'2020-06-27': {'Date': '2020-06-27', 'Column_1': 2, 'Column_3': 4},
'2020-06-28': {'Date': '2020-06-28', 'Column_1': 5, 'Column_3': 6},
'2020-06-29': {'Date': '2020-06-29', 'Column_1': 7, 'Column_2': 8, 'Column_3': 10}
}
field_names = {'Column_1', 'Column_2', 'Column_3'}
for previous_date, current_date, next_date in neighborhood(sorted(dictionary)):
for field_name in field_names:
if field_name not in dictionary[current_date]:
dictionary[current_date][field_name] = (dictionary[previous_date][field_name] + dictionary[next_date][field_name]) / 2
注意:问题不在于如何读取 csv 文件或写入 csv 文件。将有一个字典,其中包含我从输入 csv 文件中提取的数据,并且在此代码 sn-p 之后有一个代码,它将写入输出 csv 文件。我让字典有两次日期的原因是因为从输入 csv 文件中读取时我正在这样做:dictionary[row['Date']] = row,我可以将其设为列表,但它会使sorted 函数调用复杂化。假定保证第一行和最后一行被完全填充,即不会丢失列值。字典键是 datetime 对象而不是字符串。当我从输入的 csv 文件中读取数据时,我将字符串转换为 datetime 对象并将其分配为字典的键。
【问题讨论】:
-
你会用熊猫吗?
-
@funnydman 我可以使用 pandas,但我对这个库没有经验。
-
当心:这是一种糟糕的插值方法,因为如果您有多个缺失的连续值,它是非线性的。线性方法将给出: 3 - 4.67 [3 + (8-5)/3] - 6.33 [3 + 2*(8-5)/3] - 8
标签: python dictionary for-loop