使用最新的行

时间:2017-06-21 06:49:12

标签: python-3.x pandas

我的数据框包含列 - id,date,region,some_numeric_fields

id和date标识整个行,就像主键一样。我的数据框按日期降序排序。

我想要的是用匹配id的最新日期行替换区域的所有值,并将日期字段替换为相同的值,并保持数字字​​段不变。

示例输入

enter image description here

示例输出

enter image description here

数据太大,所以我不喜欢遍历每一行,而是想要更快的东西。

由于

1 个答案:

答案 0 :(得分:1)

您可以使用mask替换所有值,而无需先通过duplicated创建的掩码NaN替换所有值,然后NaNforward filling ffillfillnamethod='ffill'):

df[['date','region']] = df[['date','region']].mask(df['id'].duplicated()).ffill()

另一种解决方案是使用transform + first

g = df.groupby('id')
df['region'] = g['region'].transform('first')
df['date'] =   g['date'].transform('first')

上一个解决方案是汇总first,删除列regionjoin s

s = df.groupby('id')['date','region'].first()
df = df.drop(['date','region'], axis=1).join(s, on='id')

样品:

df = pd.DataFrame({'id':[123,123,221,221,221],
                   'date':pd.to_datetime(['2017/05/22','2017/05/21',
                                          '2017/05/11','2017/05/10','2017/05/09']),
                   'region':['region1','region2','region3','region4','region5'],
                   'num field':[1,2,3,4,5]})
print (df)
        date   id  num field   region
0 2017-05-22  123          1  region1
1 2017-05-21  123          2  region2
2 2017-05-11  221          3  region3
3 2017-05-10  221          4  region4
4 2017-05-09  221          5  region5


df[['date','region']] = df[['date','region']].mask(df['id'].duplicated()).ffill()
print (df)
        date   id  num field   region
0 2017-05-22  123          1  region1
1 2017-05-22  123          2  region1
2 2017-05-11  221          3  region3
3 2017-05-11  221          4  region3
4 2017-05-11  221          5  region3