如何从熊猫数据帧中求出一个切片

时间:2019-01-15 22:02:52

标签: python pandas

我正在尝试对字典中的部分会话进行求和,以便获得当前和上周的总计。

在一项测试中,我已将JSON转换为熊猫数据框。我正在使用.sum()函数汇总熊猫的会话总数。但是,我还需要知道本周和前一周的总会话数。我尝试了几种方法来求和(-1:-7)和(-8:-15)的值,但是我很确定我需要使用.iloc。

IN:

response = requests.get("url")
data = response.json()
df=pd.DataFrame(data['DailyUsage'])

total_sessions = df['Sessions'].sum()
current_week= df['Sessions'].iloc[-1:-7]
print(current_week) 
total_sessions =['current_week'].sum

OUT:

Series([], Name: Sessions, dtype: int64)
AttributeError 'list' object has no attribute 'sum'

注意:我已经尝试过使用pd.to_numeric和不使用pd.to_numeric,并且还使用了slice和sum方法的语法变化。 Pandas感觉不太像Python,因此我对下一步的想法一无所知。

2 个答案:

答案 0 :(得分:0)

假设from tkinter import * import tkinter.ttk as ttk class MainGUI: def __init__(self, master): self.master = master self.data_view = ttk.Treeview(master) self.data_view['columns'] = ["Date", "Item 1", "Item 2", "Item 3", "Item 4", "Source", "Destination", "Cart #",] self.data_view['show'] = 'headings' self.data_view.heading("Date", text="Date") self.data_view.heading("Item 1", text="Item 1") self.data_view.heading("Item 2", text="Item 2") self.data_view.heading("Item 3", text="Item 3") self.data_view.heading("Item 4", text="Item 4") self.data_view.heading("Source", text="Source") self.data_view.heading("Destination", text="Destination") self.data_view.heading("Cart #", text="Cart #") self.data_view.pack() self.scan_entry = ttk.Entry(master) self.scan_entry.pack() self.scan_entry.bind('<Return>', self.parseEntry) self.scan_entry.focus() self.close_button = ttk.Button(master, text="Close", command=lambda:print('want to close app')) self.close_button.pack(anchor='se') def parseEntry(self,event): #self.scan_entry.delete(0,'end') self.data_view.insert('',END,values=('',self.scan_entry.get(),'','','','','','')) #If contains certain characters, maybe insert into Source or Destination if 'a' in self.scan_entry.get(): self.data_view.insert('',END,values=('','','','','',self.scan_entry.get(),self.scan_entry.get(),'')) if __name__=='__main__': master=Tk() maingui=MainGUI(master) master.mainloop() 每天保持有效,并且您仅比较当前和前一周,则可以使用df['Sessions']为最近的14个值创建每周总和。

reshape

然后,您可以对每一行求和并获得每周的总和,最近的将是第一个元素。

weekly_matrix = df['Sessions'][:-15:-1].values.reshape((2, 7))

编辑:代码的工作方式

让我们看一维数组,该数组由pandas系列的values属性访问。它包含最近14天,从最新到最旧的顺序排列。我将其称为import numpy as np weekly_sum = np.sum(weekly_matrix, axis=1) current_week = weekly_sum[0] previous_week = weekly_sum[1]

x

然后在x = array([14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]) 上调用数组的reshape函数,以将该数据拆分为具有2行7列的2D数组(矩阵)。

reshape函数的默认行为是先填充一行中的所有列,然后再移动到下一行。因此,x [0]将是整形数组中的元素(1,1),x [1]将是元素(1,2),依此类推。在元素(1,7)用x [6]填充(到本周结束)之后,下一个元素x [7]将被放置在(2,1)中。这一直持续到完成整形操作为止,并在(2,7)中放置了x [13]。

这导致x(当前周)的前7个元素位于第一行,x(前一周)的后7个元素位于第二行。这叫做x

weekly_matrix

由于现在我们可以将每个星期的值组织在一个矩阵中,因此我们可以使用numpy.sum函数来完成操作。 numpy.sum可以使用weekly_matrix = x.reshape((2, 7)) # weekly_matrix = array([[14, 13, 12, 11, 10, 9, 8], # [ 7, 6, 5, 4, 3, 2, 1]]) 参数,该参数将控制如何计算值:

  • 如果axis,则将所有元素加在一起。
  • 如果axis=None,则将添加每列中的所有行。对于axis=0,这将导致7个元素的1D数组([21,19, 17,15,13,11,9],这不是我们想要的结果 实际上每周增加相等的天数。)
  • 如果为weekly_matrix(作为解决方案的情况),则将添加每一行中的所有列,对于axis=1,将生成2元素的1D数组。此结果的顺序 数组遵循矩阵中各行的相同顺序(即元素 0是第一行的总和,元素1是第一行的总和 第二行)。因为我们知道第一行是当前星期,所以 第二行是上周,我们可以提取信息 使用这些索引

    weekly_matrix

答案 1 :(得分:0)

要对固定数量的值进行分组和求和,例如使用每日数据和每周汇总,请考虑groupby。您可以通过适当地切片系列来实现的后退:

WriteEndElement()