pandas 比较不同 Dataframe 列中的日期并更新新列

64jmpszr  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(112)

我在panda数据框中基于其他列的值更新列时遇到了一点问题。我想做的是基于下面的3个日期列更新列NEWVAL

date1    |    date2     |     date3     | Val1 |   NEWVAL
---------------------------------------------------------------
2010-01-02  |  2010-01-07  |   2010-01-14  |  2   |     2
2010-01-10  |  2010-01-23  |   2010-05-06  |  5   |     
2010-01-02  |  2010-01-07  |   2010-01-14  |  7   |

如果date1date2中的月份与date3中的相同年份和月份相同,则我希望使用Val1中的值更新NEWVAL列。因此,在上面的示例中,由于年份2010和月份为01,因此将列Val1中的值放入NEWVAL
我对这个问题也做了一些修改,我不仅希望根据3个日期列更新NEWVAL,还希望根据Group1Group2列更新NEWVAL,如下所示:

date1    |    date2     |    date3     | Group1 |  Group2 |  Val1  |  NEWVAL
--------------------------------------------------------------------------------
2010-01-02  |  2010-01-07  |  2010-01-14  |   AA   |   AAAA  |   2    |    2
2010-01-10  |  2010-01-23  |  2010-05-06  |   bb   |   AAAA  |   5    |     
2010-04-28  |  2010-04-23  |  2010-04-19  |   bb   |   bbbb  |   7    |    7

如果这是一个简单的问题,我很抱歉-如果我不使用日期,我可以很容易地做到这一点,但我在使用datetime64[ns]数据类型时遇到了麻烦(如果可能的话,我不希望转换它),所以如果有人能帮助我,我将非常感谢。
编辑:第一部分我能做,但是有没有办法像我的第二个例子那样,分组做同样的事情?

xmakbtuz

xmakbtuz1#

    • 示例**
data = {'date1': {0: '2010-01-02', 1: '2010-01-10', 2: '2010-04-28'}, 
        'date2': {0: '2010-01-07', 1: '2010-01-23', 2: '2010-04-23'}, 
        'date3': {0: '2010-01-14', 1: '2010-05-06', 2: '2010-04-19'}, 
        'Val1': {0: 2, 1: 5, 2: 7}}
df = pd.DataFrame(data)

第一个月

date1       date2       date3       Val1
0   2010-01-02  2010-01-07  2010-01-14  2
1   2010-01-10  2010-01-23  2010-05-06  5
2   2010-04-28  2010-04-23  2010-04-19  7

日期 * 的dtypes是对象,而不是提问者的日期时间。

    • 代码**

1.提取年和月

s = df['date1'].str[:-3]

s

0    2010-01
1    2010-01
2    2010-04
Name: date1, dtype: object

1.检查行的所有日期是否为同一年和同一月

cols = ['date1', 'date2', 'date3']
cond1 = df[cols].apply(lambda x: x.str[:-3]).eq(s, axis=0).all(axis=1)

cond1

0     True
1    False
2     True
dtype: bool

1.生成NEWVAL列

out = df.assign(NEWVAL=df['Val1'].where(cond1))

out

date1       date2       date3       Val1    NEWVAL
0   2010-01-02  2010-01-07  2010-01-14  2       2.0
1   2010-01-10  2010-01-23  2010-05-06  5       NaN
2   2010-04-28  2010-04-23  2010-04-19  7       7.0

相关问题