【问题标题】:Python - replacing an array via multi-column index and .replace() functionPython - 通过多列索引和 .replace() 函数替换数组
【发布时间】:2019-03-25 08:09:29
【问题描述】:

将过滤后的数组 (a) 替换为另一列的与过滤后的数组 (b) 相同。

In[1]import pandas as pd
     import matplotlib.pyplot as plt
     %matplotlib inline
     import seaborn as sns
     sns.set(font_scale=1.5)
     import numpy as np
     import datetime
     from pylab import rcParams
     rcParams['figure.figsize'] = 20, 10``` 

-

#definition of a
In[2] a = df.fldLastUpdatedDate[df.index[df.fldScheduleCreatedDt.notnull() & 
          df.fldLastUpdatedDate.isnull()]]
In[3] a
Out[3]917   NaT
      932   NaT
      933   NaT
      934   NaT
      938   NaT
             ..
     69932  NaT
      Name: fldLastUpdatedDate, Length: 20802, dtype: datetime64[ns]

-

#definition of b
In[4] b = df.combined[df.index[df.fldScheduleCreatedDt.notnull() & 
          df.fldLastUpdatedDate.isnull()]]
In[5] b
Out[5]917   2011-08-12 09:00:00
      932   2011-08-09 09:00:00
      933   2011-08-09 10:15:00
      934   2011-08-04 13:00:00
      938   2011-08-02 12:30:00
                    ..
     69932  2018-11-02 15:00:00
      Name: combined, Length: 20802, dtype: datetime64[ns]

-

#replace a with b
In[5] df.fldLastUpdatedDate = df.fldLastUpdatedDate.replace(a,b)

-

#check a
In[6] a
Out[6]917   NaT
      932   NaT
      933   NaT
      934   NaT
      938   NaT
             ..
      69932 NaT
      Name: fldLastUpdatedDate, Length: 20802, dtype: datetime64[ns]

没有变化(也没有错误)。喜悦。

我考虑过的问题解决方案:

(1) 有没有可以用来指导我了解这里发生了什么的调试工具?

(2) 我是否在其 SOP 参数中使用.replace()

(3) 是否有任何其他基于非循环的解决方案符合解决此问题的标准?

【问题讨论】:

    标签: python-3.x pandas numpy datetime indexing


    【解决方案1】:

    如果我正确理解了这个问题,那么您有一个 DataFrame,您正在应用两个过滤器(ab)。您想要替换 df.fldLastUpdatedDate 中与 b 中的索引匹配的 a 的值。

    如果您使用loc,这相当简单。

    让我们从制作一些虚拟数据开始:

    x = list(range(0,10))
    for i in range(0,10):
        x.append(None)
    np.random.shuffle(x)
    y = list(range(0,20))
    df = pd.DataFrame(data={'x': x, 'y': y})
    

    下一步我们创建布尔掩码:

    x_is_null = df['x'].isnull()
    

    然后我们应用我们的掩码并使用来自另一个系列的具有匹配索引的值更新“x”:

    df.loc[x_is_null, 'x'] = df['y']
    

    在你的情况下,我会这样重写代码:

    第 1 步:为a 创建布尔掩码:

    a = df.fldScheduleCreatedDt.notnull() & df.fldLastUpdatedDate.isnull()
    

    第 2 步:应用我们的布尔掩码并使用 loc 替换为名为 combined 的列中的数据:

    df.loc[a, 'fldLastUpdatedDate'] = df['combined']
    

    【讨论】:

    • 完全理解。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2015-10-31
    • 2016-09-06
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多