【问题标题】:Pandas Slicing Between Dates Then Replace Values With ZeroPandas 在日期之间切片然后用零替换值
【发布时间】:2019-01-20 15:21:25
【问题描述】:

我有以下数据框:

Channel     Column 1    Column 2    Column 3
Date            
12/30/2018  638         4472        487
12/31/2018  868         6985        540
1/1/2019    755         4401        829
1/2/2019    1655        9484        1145
1/3/2019    2002        14212       1158
1/4/2019    1633        9575        1098
1/5/2019    1026        5575        941
1/6/2019    1025        4963        1007
1/7/2019    1944        10685       1246
1/8/2019    2140        9932        1151
1/9/2019    2067        1031        1087
1/10/2019   2168        1005        1074
1/11/2019   2052        9371        909
1/12/2019   1223        5953        895
1/13/2019   1268        4809        827

如果可能,我想返回以下结果[基本上将特定列中某些日期之间的值减少为零]

Channel     Column 1    Column 2    Column 3
Date            
12/30/2018  638         4472        487
12/31/2018  868         6985        540
1/1/2019    755         4401        829
1/2/2019    1655        9484        1145
1/3/2019    2002        14212       1158
1/4/2019    1633        9575        1098
1/5/2019    1026        5575        941
1/6/2019    0           4963        1007
1/7/2019    0           10685       1246
1/8/2019    0           9932        1151
1/9/2019    0           1031        1087
1/10/2019   2168        1005        1074
1/11/2019   2052        9371        909
1/12/2019   1223        5953        895
1/13/2019   1268        4809        827

我正在尝试按特定日期的特定列进行过滤,但无法使其正常工作。

我尝试了以下方法,但运气不佳

df[df['Channel'] == 'Branded Paid Search'].loc['1/6/2019':'1/9/2019']['Sessions'].apply(lambda x: 0 if x < 4000 else 0).to_frame()

这可行,但不确定如何将这些值恢复到原始数据框中。

我试过了:

def zero(df):
  if df[df['Column 1'] > 0].loc['1/6/2019':'1/9/2019']:
    return 0
  else:
    return 1

df.apply(zero, axis=1)

ValueError: ('The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().')

我试过了:

sessions_df[sessions_df['Column 1'] > 0].loc['1/6/2019':'1/9/2019'] = 0

没有任何变化。

任何帮助将不胜感激

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    首先用to_datetime创建DatetimeIndex,然后用DataFrame.loc设置值:

    df.index = pd.to_datetime(df.index)
    
    df.loc['1/6/2019':'1/9/2019', 'Column 1'] = 0
    print (df)
                Column 1  Column 2  Column 3
    Channel                                 
    2018-12-30       638      4472       487
    2018-12-31       868      6985       540
    2019-01-01       755      4401       829
    2019-01-02      1655      9484      1145
    2019-01-03      2002     14212      1158
    2019-01-04      1633      9575      1098
    2019-01-05      1026      5575       941
    2019-01-06         0      4963      1007
    2019-01-07         0     10685      1246
    2019-01-08         0      9932      1151
    2019-01-09         0      1031      1087
    2019-01-10      2168      1005      1074
    2019-01-11      2052      9371       909
    2019-01-12      1223      5953       895
    2019-01-13      1268      4809       827
    

    【讨论】:

    • 这成功了!谢谢 - 知道这很简单。非常感谢
    猜你喜欢
    • 2020-09-02
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2016-08-05
    相关资源
    最近更新 更多