日期之间分割的熊猫,然后将值替换为零

时间:2019-01-20 07:19:20

标签: python pandas dataframe

我有以下DataFrame:

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

什么都没有改变。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分: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