我有以下数据框示例:
df = pd.DataFrame({'first_date': ['01-07-2017', '01-07-2017', '01-08-2017'],
'end_date': ['01-08-2017', '01-08-2017', '15-08-2017'],
'second_date': ['01-09-2017', '01-08-2017', '15-07-2017'],
'cust_num': [1, 2, 1],
'Title': ['philips', 'samsung', 'philips']})
cus_num
在列中相等Title
相等second_date
<=另一行end_date
如果满足所有这些要求,则应将值True
附加到原始行的新列中。
因为我正在使用大型数据集,所以我正在寻找一种有效的方法来执行此操作。
在这种情况下,只有第一个记录应该获得真实值。
我已经用python中的apply
和lambda
函数检查了groupby
,但是找不到使它们起作用的方法。
答案 0 :(得分:0)
尝试一下(自发地我无法提出一种更快的方法):
import pandas as pd
import numpy as np
df["second_date"]=pd.to_datetime(df["second_date"], format='%d-%m-%Y')
df["end_date"]=pd.to_datetime(df["end_date"], format='%d-%m-%Y')
df["new col"] = False
for cust in set(df["cust_num"]):
indices = df.index[df["cust_num"] == cust].tolist()
if len(indices) > 1:
sub_df = df.loc[indices]
for title in set(df.loc[indices]["Title"]):
indices_title = sub_df.index[sub_df["Title"] == title]
if len(indices_title) > 1:
for i in indices_title:
if sub_df.loc[indices_title]["second_date"][i] <= sub_df.loc[indices_title]["end_date"][i]:
df["new col"] = True
break
df["new_col"] = new_col
首先,您需要将所有日期列彼此转换为可比较的日期列。然后创建所需的其他列。
现在创建一组所有唯一的客户编号,并对其进行遍历。对于每个客户编号,获取具有该客户编号的所有行索引的列表。如果此列表长于1,则您有几个相同的客户编号。然后,使用所有具有相同客户编号的行创建数据框的子df。然后遍历所有标题的集合。对于每个标题,检查子df中的其他位置是否有相同的标题(len> 1)。如果是这种情况,则遍历所有行,并在第一次满足日期条件的同一行的其他列中写上True
。
答案 1 :(得分:-1)
这应该有效。另外,在阅读评论时,我假设所有cust_num是唯一的。
import pandas as pd
df = pd.DataFrame({'first_date': ['01-07-2017', '01-07-2017', '01-08-2017'],
'end_date': ['01-08-2017', '01-08-2017', '15-08-2017'],
'second_date': ['01-09-2017', '01-08-2017', '15-07-2017'],
'cust_num': [1, 2, 1],
'Title': ['philips', 'samsung', 'philips']})
df["second_date"]=pd.to_datetime(df["second_date"])
df["end_date"]=pd.to_datetime(df["end_date"])
df['Value'] = False
for i in range(len(df)):
for j in range(len(df)):
if (i != j):
if (df.loc[j,'end_date'] >= df.loc[i,'second_date']) == True:
if (df.loc[i,'cust_num'] == df.loc[j,'cust_num']) == True:
if (df.loc[i,'Title'] == df.loc[j,'Title']) == True:
df.loc[i,'Value'] = True
告诉我该代码是否有效!以及任何错误。