【问题标题】:Excel like formulas with pandasExcel 类似于 pandas 的公式
【发布时间】:2015-07-31 09:07:18
【问题描述】:

我有一个这种格式的熊猫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   |

【问题讨论】:

  • 那你在追求什么?给定月份是否为NaN,前3个月也是NaN
  • 您需要显示更多示例数据并添加所需的结果。根据您的描述,该 excel 公式是不够的,因为行动月份可能因行而异。使用 any()all() 在 pandas 中复制该 excel 公式非常容易。
  • 我对 int 值的指标感兴趣,在它们之后有 3 个后续 NaNs,我添加了一个示例。
  • 啊,谢谢,示例输出有很大帮助!!!

标签: python excel pandas


【解决方案1】:

我不确定你想如何处理最右边的列(你只有一个'?'),但你可以从以下代码开始相当容易地进行调整,或者只是用占位符数字或 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)))

起始数据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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    相关资源
    最近更新 更多