Python-NumPy.Where with a Dictionary

时间:2018-10-29 11:31:34

标签: python pandas numpy dataframe

我可能做错了此事,或者可能有比这更好的方法,因为我还是Python的新手。对于任何明显的错误,我们会提前道歉。

我有一个带有STR列的Pandas Dataframe,其中包含日期和时间。这是STR,因为时间是“广播”格式的,这意味着一天中有29个小时。所以我们会看到类似01 / Jan / 2018 29:59:59的日期。 距离其1秒和其02 / Jan / 2018 06:00:00。

我的目标是将这些数据转换为实时数据。这意味着24到29之间的任何小时也需要日期转换。 我已经将STR从['Ti']拆分为2个新列['Dt']和['Ti'],将小时数作为['Hr']拖到新列中,并使其成为INT。 / p>

然后我将pd.to_datetime应用于['Dt']并添加了一条规则。

spec.js

        var loginpage = require('./login');
        var Menu  = require('./menu');
        describe('todo', function() {
            it('activity', function() {

             var question = new loginpage();
            var menu = new Menu();
                    browser.sleep(10000);
                    menu.dropdown('Inquiry').click();

        });
        });


   PAGE OBJECT FILE menu.js


    var MenuPage = function() {
      this.dropdown = function(dropdownName) {

        var openDropdown = function() {
          element(by.css('.nav'))
              .element(by.css('[title=dropdownName]'))
              .click();
        };
     return {

          option: function(optionName) {
            openDropdown();
            return element(by.css('.dropdown.open'))
                .element(by.linkText(optionName));
          }
        }

      };
    };

    module.exports = MenuPage;

这很完美。

我现在需要将“小时”更改为实时,例如24 = 00、25 = 02等。

我认为最好的方法是使用DICT并对其进行映射,所以我制作了DICT,

df['Dt'] = np.where(df['Hr'] > 23, df['Dt']+pd.DateOffset(1),df['Dt']+pd.DateOffset(0) )

然后写这个

HourMap = {'24':'00','25':'01','26':'02','27':'03','28':'04','29':'05','30':'06'}  

但是我收到“ ValueError”

df['Hr1'] = np.where(df['Hr'] > 23, df.replace({'Hr':HourMap}),df['Hr'])

我查看了数据框中的那些行,它们只是普通的INT。在测试中,我可以将数学应用于它们(例如df ['Test'] = df ['Hr'] + 1。

我确实将它们转换为STR并尝试了相同的规则,但是得到了相同的错误。

我只是疯了吗?

谢谢

2 个答案:

答案 0 :(得分:3)

我认为需要改变:

df.replace({'Hr':HourMap})

map,如果某些值不匹配并返回NaN,则用fillna将其替换为原始值:

df['Hr'].map(HourMap).fillna(df['Hr'])
#alternative solution if performance is not important in large df
#df['Hr'].replace(HourMap)

因为df.replace返回带有替换列Hr的DataFrame的所有列

答案 1 :(得分:2)

您真的不应该在这里使用字典,甚至不需要np.where。使用modulo operator

In [1]: import numpy as np
In [2]: np.arange(31)%24
Out[2]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23,  0,  1,  2,  3,  4,  5, 6], dtype=int32)

您的数字在24岁时会“环绕”,这是课本的模数用例。这样,完整的代码就变成了:

df['Hr1'] = df['Hr'] % 24

同样,您也可以仅使用整数除法就可以将日期添加到不带np.where的日期中

df['Dt'] = df['Dt']+pd.DateOffset(Df['Hr']//24)