在迭代行时检查条件的快速方法

时间:2018-04-04 08:42:01

标签: python pandas

假设我有一个以下性质的数据框:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx\ODP.Net]
@="c:\\oracle\\product\\12.2\\odp.net\\bin\\2.x"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\ODP.Net]
@="c:\\oracle\\product\\12.2\\odp.net\\bin\\4"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\Oracle.ManagedDataAccess]
@="c:\\oracle\\product\\12.2\\odp.net\\managed\\common"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\Oracle.ManagedDataAccess.EntityFramework6]
@="c:\\oracle\\product\\12.2\\odp.net\\managed\\common\\EF6"

我想创建一个新列,以便对于给定的SHOP,它会检查是否存在与结束日期(当前日期)匹配的开始日期(将来),并且还匹配ACTION值。

所以Dataframe看起来像

START             END               SHOP             ACTION
2016-01-07        2016-01-10        ABC              B
2016-01-10        2016-02-07        ABC              B
2016-04-07        2016-05-07        ABC              B
2016-05-15        2016-05-18        ABC              S
2016-10-07        2016-10-07        ABC              B
2016-11-07        2016-11-07        ABC              B
2016-01-15        2016-01-22        DEF              S
2016-05-22        2016-11-07        DEF              S
2016-11-07        2016-12-07        DEF              S
2016-01-04        2016-02-04        XYZ              B
2016-09-07        2016-10-26        XYZ              T
2016-10-25        2016-10-30        XYZ              B

2 个答案:

答案 0 :(得分:1)

这对你有用 -

df.merge(df.drop('END', axis=1).rename(index=str, columns = {'START':'END'}).assign(check=1), on=['END', 'SHOP', 'ACTION'], how='left').fillna(0)

答案 1 :(得分:0)

虽然您可以通过遍历数据框来完成所需的操作,但您也可以使用groupby和join来完成任务,如下所示:

df = df.reset_index()
df = df.groupby("ACTION").apply(
    lambda x : pd.merge(
        left = x, right = x, how = "left", left_on = "END", right_on = "START", suffixes = ('', "_y")
    )
)
df["CHECK"] = df.index_y.notnull().astype(int)
df = df[["index", "START", "END", "SHOP", 'ACTION', "CHECK"]]
df = df.set_index("index")

如果你的牌桌太大,你可以优化上面的代码,以便更好地“等待”。