繁体   English   中英

从2个数据帧熊猫的列中减去两个日期

[英]Subtracting Two dates from columns in 2 dataframes pandas

我有以下代码:

for tup in unique_tuples:
    user_review = reviews_prior_to_influence_threshold[(reviews_prior_to_influence_threshold.business_id == tup[0]) & (reviews_prior_to_influence_threshold.user_id == tup[1])]     

    for friend in tup[2]:
        friend_review = reviews_prior_to_influence_threshold[(reviews_prior_to_influence_threshold.business_id == tup[0]) & (reviews_prior_to_influence_threshold.user_id == friend)] 

        if (friend_review.date - user_review.date) <= 62:
            tup[2].remove(friend)

我正在从元组列表中提取值,并将其与数据框的一列中的值匹配,然后在该值等于true的行中进行屏蔽。

user_review_mask是一行,代表用户对企业进行的评论。 friend_review掩码也是一行,代表用户的朋友进行的评论。

tup [2]是tup [1]中user_id的friend_id的列表。 因此,我遍历了用户的每个朋友,然后将那个friend_id与他的业务评论进行匹配。

从本质上讲, 我希望查看对于2个不同用户的2个不同评论,friend_review.date和user_review.date之间的差异是否为<= +2个月。 如果相差不少于2个月,我想从tup [2]列表中删除friend_id。

两个数据帧/行中的两个日期均为数据类型datetime64 [ns],并且每个日期的格式均设置为“ yyyy-mm-dd”,因此我想可以轻松地将它们相减,以查看两者之间是否存在较小的差异超过两次审核之间的间隔。

但是,我不断收到以下错误:

TypeError: invalid type comparison

它还提到Numpy不喜欢比较vs“ None”,由于列中没有空值,我对此也有些困惑。

更新:解决方案最终追加到新列表,而不是从当前列表中删除,但这可行。

#to append tuples
business_reviewer_and_influenced_reviewers = []

#loop through each user and create a single row df based on a match from the reviews df and our tuple values
for tup in unique_tuples:
    user_review_date = reviews_prior_to_influence_threshold.loc[(reviews_prior_to_influence_threshold.business_id == tup[0]) & 
                                                                (reviews_prior_to_influence_threshold.user_id == tup[1]), 'date']     

    user_review_date = user_review_date.values[0]

    #loop through list each friend of the reviewer that also reviewed the business in tup[2]
    for friend in tup[2]:
        friend_review_date = reviews_prior_to_influence_threshold.loc[(reviews_prior_to_influence_threshold.business_id == tup[0]) & 
                                                                      (reviews_prior_to_influence_threshold.user_id == friend), 'date']

        friend_review_date = friend_review_date.values[0]
        diff = pd.to_timedelta(friend_review_date - user_review_date).days

        #append business_id, reviewer, and influenced_reviewer as a tuple to a list
        if (diff >= 0) and (diff <= 62):
            business_reviewer_and_influenced_reviewers.append((tup[0], tup[1], friend))

数据框中的日期可能不是datetime64 dtype实例,因此invalid type comparison 您可以使用df.dtypes进行检查。 如果是这样,请使用df.date = pd.to_datetime(df.date)

您的数据框中可能有一些日期为null ,因此比较与“无”。 使用df[pd.notnull(df.dates)]

顺便说一句:减去日期应该使您有时间timedelta因此您可能需要执行类似(friend_review.date - user_review.date).dt.days <= 62

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM