【问题标题】:Report with Pivot Tables like in Excel using Python使用 Python 在 Excel 中使用数据透视表进行报告
【发布时间】:2016-08-14 08:33:48
【问题描述】:

我有数据

ID,"address","used_at","active_seconds","pageviews"
0a1d796327284ebb443f71d85cb37db9,"vk.com",2016-01-29 22:10:52,3804,115
0a1d796327284ebb443f71d85cb37db9,"2gis.ru",2016-01-29 22:48:52,214,24
0a1d796327284ebb443f71d85cb37db9,"yandex.ru",2016-01-29 22:14:30,4,2
0a1d796327284ebb443f71d85cb37db9,"worldoftanks.ru",2016-01-29 22:10:30,41,2

但它太大了,Excel 打不开。 我需要将所有时间划分为不同的周,并将结果打印到每个id 到每个address。 它应该看起来像

ID                                 vk.com              2gis.ru             yandex.ru

0a1d796327284ebb443f71d85cb37db9     23                     40                  56
465a3fc01a62fd89a8094abdaccdcc99      0                     100                 45
...

我一直都在数

data = pd.read_csv("desktop-visits-dnp.csv")
group = data.groupby(['ID', 'address']).active_seconds.sum()

但我需要把它分成几个星期

但我对python没有太多技能,也不知道我能不能完成这项任务

【问题讨论】:

  • 什么意思:to divide all time to different week?
  • 我需要在不同的星期获得不同的桌子。例如 25.01 - 31.01、1.02 - 07.02

标签: python excel numpy pandas


【解决方案1】:

以下代码为每个IDweek 创建active_seconds 的总和。

首先,生成一些与您类似的示例数据:

df = pd.DataFrame()
ids = [''.join([random.choice(string.ascii_lowercase + string.digits) for _ in range(16)]) for i in range(10)]
addresses = [''.join([random.choice(string.ascii_lowercase) for _ in range(10)]) for i in range(10)]
df['ID'] = np.random.choice(ids, size=10000)
df['address'] = np.random.choice(addresses, size=10000)
df['active_seconds'] = np.random.randint(0, 100, 10000)

df['used_at'] = pd.date_range(start=datetime(2016, 1, 1, 0, 0, 0), freq='H', periods=10000)

现在将used_atIDaddress 设置为indexunstack() 后者,这会将address 放入以active_seconds 作为值的列中。

df = df.set_index(['used_at', 'ID', 'address']).unstack().loc[:, 'active_seconds'].reset_index('ID')

接下来,每周按IDresample 分组,同时对每个区间内的所有值求和,并将ID 重置为列而不是索引:

df = df.groupby('ID').resample('W', how='sum').reset_index('ID')

获取每个 IDaddress 的每周使用量:

df.head()

address                   ID  afgpxizbum  cihchvzttw  dguznssmbi  irpvqtmuva  \
used_at                                                                        
2016-01-03  06y2myiclyb2s4hr         NaN         NaN         NaN        19.0   
2016-01-10  06y2myiclyb2s4hr        57.0        15.0        66.0         NaN   
2016-01-17  06y2myiclyb2s4hr        13.0       144.0       152.0       139.0   
2016-01-24  06y2myiclyb2s4hr       186.0       112.0         NaN         NaN   
2016-01-31  06y2myiclyb2s4hr        15.0        68.0       128.0        63.0   

address     otlkynddwv  ptzzhghnfl  rgwbuevvez  tgvbvfibaf  toimlivump  \
used_at                                                                  
2016-01-03        30.0         NaN         NaN        50.0         NaN   
2016-01-10        59.0        28.0         NaN         NaN       214.0   
2016-01-17       106.0        26.0       179.0        62.0        69.0   
2016-01-24        87.0        10.0       130.0       264.0         7.0   
2016-01-31       144.0         NaN       215.0         NaN       208.0   

address     uwsdzqyudi  
used_at                 
2016-01-03        99.0  
2016-01-10       235.0  
2016-01-17       128.0  
2016-01-24        85.0  
2016-01-31        60.0 

现在您可以在索引中group_byweek,迭代结果并保存到索引。

for week, data in df.groupby(level=0):
    data.to_excel('{}.xlsx'.format(week))

【讨论】:

  • 我有内存错误。如何将此数据保存到excel 文件?我需要将不同的星期保存到不同的文件中。例如带有2016-01-03 的数据到一个文件,2016-01-10 到另一个文件等。
  • 查看更新以每周保存到 excel。如果您遇到内存错误,您可能希望以块的形式读取数据并分批处理,并在第二步中聚合几个每周文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多