除以列表数组中的每个值

时间:2018-03-23 12:41:20

标签: python python-3.x pandas

我试图将列表中的每个数组值除以80。我试过的是,

dfs = pd.read_excel('ff1.xlsx', sheet_name=None)
dfs1 = {i:x.groupby(pd.to_datetime(x['date']).dt.strftime('%Y-%m-%d'))['duration'].sum() for i, x in dfs.items()}
d = pd.concat(dfs1).groupby(level=1).apply(list).to_dict()
print(d)

OP:

{'2017-05-06': [197, 250], '2017-05-07': [188, 80], '2017-05-08': [138, 138], '2017-05-09': [216, 222], '2017-06-09': [6]}

但预期OP:

1 : Divide by 80
{'2017-05-06': [2, 3], '2017-05-07': [2, 1], '2017-05-08': [2, 2], '2017-05-09': [2, 2], '2017-06-09': [0]}
2 : total of each array and subtract each value (3+2 = 5-3 and 5-2)
{'2017-05-06': [3, 2], '2017-05-07': [1, 2], '2017-05-08': [2, 2], '2017-05-09': [2, 2], '2017-06-09': [0]}

如何使用python执行此操作?

1 个答案:

答案 0 :(得分:3)

我认为需要:

d = pd.concat(dfs1).div(80).astype(int)
d = d.groupby(level=1).transform('sum').sub(d).groupby(level=1).apply(list).to_dict()
print (d)

{'2017-06-09': [0], '2017-05-08': [1, 1], '2017-05-09': [2, 2], 
 '2017-05-07': [1, 2], '2017-05-06': [3, 2]}

<强>解释

  1. 首先按concat
  2. 创建MultiIndex DataFrame
  3. 除以div,必要时转换为int s
  4. 对于每个组的总和,使用transform可能会减去sub
  5. 的值
  6. 上次使用GroupBy.apply
  7. 创建list