Uri*_*ren 5 python excel 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
Run Code Online (Sandbox Code Playgroud)
换句话说,列是月,索引是user_id,每个单元格包含一个整数,或NaN
这些数字表示已采取的行动,如果行动3数月后仍被视为成功,则不需要采取其他行动.
我的目标是找到成功的行动清单
在Excel中,我会写一个这样的公式:
Sheet2!E5=AND(Sheet1!E5<>"NaN",Sheet1!D5="NaN",Sheet1!C5="NaN",Sheet1!B5="NaN")
Run Code Online (Sandbox Code Playgroud)
并将它拖到其余的列,然后我会指示一个动作是否成功.
如何用熊猫高效地完成这项工作?
样本输出:
对于上面给出的示例,所需的输出应为:
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 |
Run Code Online (Sandbox Code Playgroud)
我不确定你想如何处理最右边的列(你只有一个“?”),但你可以从以下代码开始相当容易地调整,或者只是用占位符数字或 NaN 填充数据:
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)))
Run Code Online (Sandbox Code Playgroud)
起始数据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
Run Code Online (Sandbox Code Playgroud)
结果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
Run Code Online (Sandbox Code Playgroud)
对于上述填充,您可以添加三个占位符列,然后稍微调整其余代码:
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)))
Run Code Online (Sandbox Code Playgroud)
现在最后一列中有一个“True”:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1251 次 |
| 最近记录: |