假设我有一个以下性质的数据框:
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
答案 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")
如果你的牌桌太大,你可以优化上面的代码,以便更好地“等待”。