【问题标题】:Pandas - cohorting in a dataframePandas - 在数据框中进行分组
【发布时间】: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 看起来像的示例数据。
  • 编辑描述以添加示例所需的输出

标签: python pandas


【解决方案1】:

从此数据框开始

           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

并定义这个函数

def getLeftAlignSeries(s):      
   a = np.array(np.trim_zeros(s),'f')
   b = np.pad(a,(0,(len(s) - len(a))),mode='constant',constant_values=0)     
   return b

然后是 Apply()

dfNew = df.apply(getLeftAlignSeries,axis=1)    
dfNew   

            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   88          334         0           0           0           0
100000018   332         0           0           0           0           0
100000019   138         177         6           0           0           0
100000023   558         179         243         0           0           0
100000035   115         1           0           0           0           0

【讨论】:

  • AttributeError: ("'module' object has no attribute 'pad'", u'occurred at index 100003211')
  • 抱歉,我假设您有以下导入语句。将 numpy 导入为 np
  • 是的,否则它会在 'np' 上失败并出现 NameError: ("global name 'np' is not defined", u'occurred at index 100003211')
  • 嗯,我在 numpy 1.6.2 上,当前版本看起来像 1.9。而且,看起来 pad 是在 1.7 中添加的。问题来了。
  • 是的,升级或自己做填充
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多