像pandas

时间:2015-05-19 13:37:42

标签: python excel pandas

我的pandas DataFrame格式为

User_id|2014-01|2014-02|2014-03|2014-04|2014-05|...|2014-12
1      |   7   | NaN   | NaN   | NaN   | NaN   |...|  NaN
2      | NaN   |   5   | NaN   | NaN   |   9   |...|  NaN
3      |   2   |   4   | NaN   | NaN   | NaN   |...|  NaN

用词来说,列是月,索引是user_id,每个单元格都包含一个整数,或NaN

数字代表已采取的行动,如果行动在3个月之后被视为成功,则不需要采取其他行动。

我的目标是找到成功的行动清单

在Excel中,我写了一个这样的公式:

Sheet2!E5=AND(Sheet1!E5<>"NaN",Sheet1!D5="NaN",Sheet1!C5="NaN",Sheet1!B5="NaN")

然后将其拖到其余列中,然后我会指示某个操作是否成功。

如何用pandas有效地完成这项工作?

示例输出:

对于上面给出的示例,所需的输出应为:

User_id|2014-01|2014-02|2014-03|2014-04|2014-05|
1      |   T   |   F   |   F   |   F   |   F   |
2      |   F   |   F   |   F   |   F   |   ?   |
3      |   F   |   T   |   F   |   F   |   F   |

1 个答案:

答案 0 :(得分:2)

我不确定你想如何处理最右边的列(你只有一个'?')但是你可以从下面的代码开始相当容易地调整,或者用占位符号或NaN填充数据:< / p>

df2 = df.copy()    
for i in range(1,len(df.columns)):
    df2.iloc[:,i] = ((df.iloc[:,i].notnull()) & 
                     (df.iloc[:,i+1:i+4].apply(lambda x: all(x.isnull()),axis=1)))

启动数据df

   User_id  2014-01  2014-02  2014-03  2014-04  2014-05
0        1        7      NaN      NaN      NaN      NaN
1        2      NaN        5      NaN      NaN        9
2        3        2        4      NaN      NaN      NaN

结果df2

   User_id 2014-01 2014-02 2014-03 2014-04 2014-05
0        1    True   False   False   False   False
1        2   False   False   False   False   False
2        3   False    True   False   False   False

对于前面提到的填充,您可以添加三个占位符列,然后稍微调整其余代码:

df[['pad1','pad2','pad3']] = np.nan

df2 = df.copy().iloc[:,:-3]    
for i in range(1,len(df2.columns)):
    df2.iloc[:,i] = ((df.iloc[:,i].notnull()) & 
                     (df.iloc[:,i+1:i+4].apply(lambda x: all(x.isnull()),axis=1)))

现在你在最后一栏中有一个'真':

   User_id 2014-01 2014-02 2014-03 2014-04 2014-05
0        1    True   False   False   False   False
1        2   False   False   False   False    True
2        3   False    True   False   False   False