【发布时间】:2015-01-09 12:36:24
【问题描述】:
熊猫新手。我正在尝试对按日历日期存储值的客户使用数据进行一些群组分析,但我想按该客户的“开始”日期进行分析。数据帧在该客户的开始日期之前包含零。
这是数据的样子:
2014-06-01 2014-07-01 2014-08-01 2014-09-01 2014-10-01 2014-11-01 \
100003211 0 0 0 0 0 0
100000006 0 0 0 0 88 334
100000018 0 0 332 0 0 0
100000019 0 0 0 138 177 6
100000023 558 179 243 0 0 0
100000035 0 0 115 1 0 0
对于我正在尝试做的事情,我的心理印象是将每一行中的零去除到最左边的非零值,然后“左对齐”该行。每行都以非零数字开头,然后像以前一样继续。
这是我尝试将上述数据帧处理成“队列”数据帧的循环:
for client_id,row in df_raw.iterrows():
while not row.empty and row[:0] == 0:
row.pop(0)
df_cohorted[client_id] = row
...但是我收到了这个错误:ValueError:一个系列的真值是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
同时,这甚至看起来都不是正确的方法。从阅读其他主题看来,我可能想转置然后使用映射函数?
欢迎提出任何建议,无论是使用不同的方法还是(如果我的方法最好的话)来帮助确定问题所在。
编辑
希望输出看起来像这样。这些列将指示每行数据的第一个非零月份,第二个将是它之后的日历月,等等。
1st 2nd 3rd 4th 5th 6th
100003211 0 0 0 0 0 0
100000006 88 334
100000018 332 0 0 0
100000019 138 177 6
100000023 558 179 243 0 0 0
100000035 115 1 0 0
【问题讨论】:
-
如果你“左对齐”行不会弄乱你的列吗?
-
另外,我相信你得到了
ValueError,因为row[:0] == 0,你正在分割整行(这已经用iterrows完成了,而我假设你正在尝试访问该行中一次只有一个元素。因此建议使用row.item()。 -
重新弄乱列,在群组数据框中,列将是第 1 个月、第 2 个月、第 3 个月等。
-
我建议您举一个示例,其中包含一些您希望
df_cohorted看起来像的示例数据。 -
编辑描述以添加示例所需的输出