检查几列中的每一行,如果满足要求,则为每一行追加。蟒蛇

时间:2018-08-16 19:00:38

标签: python pandas dataframe lambda group-by

我有以下数据框示例:

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']})
  1. 如果cus_num在列中相等
  2. 数据帧中的两行Title相等
  3. 一行second_date <=另一行end_date

如果满足所有这些要求,则应将值True附加到原始行的新列中。 因为我正在使用大型数据集,所以我正在寻找一种有效的方法来执行此操作。 在这种情况下,只有第一个记录应该获得真实值。

我已经用python中的applylambda函数检查了groupby,但是找不到使它们起作用的方法。

2 个答案:

答案 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

告诉我该代码是否有效!以及任何错误。