Pandas - 在数据框中分组

Pandas - cohorting in a dataframe

pandas 的新手。我正在尝试对客户端使用数据进行一些队列分析,其中值按日历日期存储,但我想按该客户端的 "start" 日期进行分析。数据框在该客户的开始日期之前包含零。

数据是这样的:

          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   

对于我正在尝试做的事情,我的心理印象是去除每行中的零直到最左边的非零值,然后 "left align" 该行。每行将以非零数字开头,然后像以前一样继续。

这是我试图从上述数据帧处理成 "cohorted" 数据帧的循环:

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   

从这个数据框开始

           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