【问题标题】:Pandas: Date difference loop between columns with similiar names (ACD and ECD)Pandas:具有相似名称的列之间的日期差异循环(ACB 和 ECD)
【发布时间】:2019-09-19 11:00:02
【问题描述】:

我在 Jupyter 工作,有大量的专栏,其中很多都是日期。我想创建一个循环,该循环将返回一个新列,其中包含两个名称相似的列之间的日期差异。

例如:

df['Site Visit ACD']
df['Site Visit ECD']
df['Sold ACD (Loc A)']
df['Sold ECD (Loc A)']

新列将具有列 df['Site Visit Cycle Time'] = ACD 和 ECD 之间的日期差异。通常,它总是包含“ACD”的列减去包含“ECD”的列。这个怎么写?

任何帮助表示赞赏!

【问题讨论】:

    标签: pandas loops numpy jupyter


    【解决方案1】:

    通常,它总是包含“ACD”的列减去包含“ECD”的列。

    此答案假定列标题没有噪音,即它们仅在“ACD”/“ECD”方面有所不同,并且除此之外完全相同(包括大写/小写)。还假设总是有一个匹配的列。此代码不检查它是否覆盖了将日期差异写入的列。

    这种方法在线性时间内起作用,因为我们对列集进行一次迭代,并直接按名称访问匹配的列。

    test.csv

    Site Visit ECD,Site Visit ACD,Sold ECD (Loc A),Sold ACD (Loc A)
    2018-06-01,2018-06-04,2018-07-05,2018-07-06
    2017-02-22,2017-03-02,2017-02-27,2017-03-02
    

    代码

    import pandas as pd
    
    df = pd.read_csv("test.csv", delimiter=",")
    
    for col_name_acd in df.columns:
        # Skip columns that don't have "ACD" in their name
        if "ACD" not in col_name_acd: continue
    
        col_name_ecd = col_name_acd.replace("ACD", "ECD")
    
        # we assume there is always a matching "ECD" column
        assert col_name_ecd in df.columns
    
        col_name_diff = col_name_acd.replace("ACD", "Cycle Time")
        df[col_name_diff] = df[col_name_acd].astype('datetime64[ns]') - df[col_name_ecd].astype('datetime64[ns]')
    
    print(df.head())
    

    输出

      Site Visit ECD Site Visit ACD Sold ECD (Loc A) Sold ACD (Loc A)  \
    0     2018-06-01     2018-06-04       2018-07-05       2018-07-06   
    1     2017-02-22     2017-03-02       2017-02-27       2017-03-02   
    
      Site Visit Cycle Time Sold Cycle Time (Loc A)  
    0                3 days                  1 days  
    1                8 days                  3 days  
    

    【讨论】:

    • 谢谢@snwflk。少量的列有空白单元格。如果我想将逻辑合并到这个循环中,上面写着“如果这些列中的任何一个是空白的,请跳过这一行或只返回一个空白”,我该怎么做?
    • 在这些情况下现在会发生什么?尝试转换为 datetime 时是否收到 ValueErrors?在这种情况下,您可以在循环体的最后一行周围使用 try 块。
    【解决方案2】:

    以下代码将执行以下操作:

    1. 查找相似的列(使用fuzzywuzzy包超过90个比率模糊)
    2. 执行日期比较(或时间)
    3. 避免在两侧执行相同的计算
    4. 如果列的名称或多或少类似,则获取名称“站点访问”
    5. 如果名称不同,则获取名称“'column 1'和'column 2'之间的差异”

    希望对你有帮助。

    import pandas as pd
        from fuzzywuzzy import fuzz
        name = pd.read_excel('Book1.xlsx', sheet_name='name')
        unique = []
        for i in name.columns:
            for j in name.columns:
                if i != j and fuzz.ratio(i, j) > 90 and i+j not in unique:
                    if 'Site Visit' in i:
                        name['Site Visit'] = name[i] - name[j]
                    else:
                        name['difference between '+i+' and '+j] = name[i] - name[j]
                    unique.append(j+i)
                    unique.append(i+j)
        print(name)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-14
      • 2020-10-25
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 2016-10-01
      相关资源
      最近更新 更多