【发布时间】:2018-06-01 11:21:32
【问题描述】:
我有一个列宽可变的 csv 文件,其中每一行是一个日期、一个区域和一组在该日期/区域观察到的 ID。
数据如下:
12/01/2017,Region1,BMW_123,TESLA_332,TESLA_2002
11/07/2017,Region2,TESLA_332,BMW_123,TESLA_2002,TESLA_99812
11/19/2017,Region2,BMW_123,TESLA_31
10/23/2017,Region1,BMW_4,TESLA_3,TESLA_90
11/02/2017,Region2,TESLA_28,BMW_56,TESLA_22,TESLA_821
10/14/2017,Region2,BMW_1,BMW_8,BMW_2,TESLA_3,TESLA_4,TESLA_99,TESLA_81,TESLA_56
我正在尝试:
(1) 拆分所有 ID 并保留品牌,因此“TESLA_12345”将变为“TESLA”。这部分没问题。
(2) 按月-区域聚合,以便我们知道每个月-区域元组中每个品牌(例如特斯拉或宝马)的失败次数。
输出应该是这样的(格式不是很重要——它必须是清晰的):
month region BMW TESLA
10 Region1 1 2
12 Region1 1 2
10 Region2 3 5
11 Region2 3 7
这样做似乎很自然的方法是逐行读取 CSV 并更新嵌套字典中每个品牌的计数(即,有一个包含 2 个区域的区域字典,每个区域都包含保持{BMW:2, TESLA: 1} 这样的计数。但是,我正在努力更新嵌套的字典,我想知道是否有更简单的解决方案(或者 Pandas 是否可以毫不费力地做到这一点,等等)
(注意:显然,月份可以从日期中提取:
datetime.strptime(mydate, "%m/%d/%Y").strftime("%m")
)
【问题讨论】:
-
也许你可以用堆栈做一些事情,例如
df_stacked = df.set_index(['date','region']).stack() -
感谢您的回复!我在熊猫上发现了一些列不均匀的帖子,例如stackoverflow.com/questions/15242746/… 和 stackoverflow.com/questions/40880724/… 但我的 python 还不够强大,无法知道使用 pandas 数据框是否是处理这种情况的“好”方法,或者是否逐行更适合,尤其是。因为它是一种非传统的聚合(因为我们需要在跨行聚合之前获取行内计数)。
标签: python pandas csv dictionary aggregate