从最近的年份复制Pandas中的行

jexiocij  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(139)

假设我有以下数据集。

import numpy as np
import pandas as pd

d = {'name': ['a', 'a', 'a'], 'year': [2000, 2001, 2002], 'value': [10, 17, 22] }
data_frame  = pd.DataFrame(data=d)
data_frame

d1 = {'name': ['a', 'a', 'a'], 'year': [2001, 2002, 2003], 'value': [10, 17, 22] }
data_frame1  = pd.DataFrame(data=d1)
data_frame1

d2 = {'name': ['a', 'a', 'a'], 'year': [2000, 2002, 2003], 'value': [10, 17, 22] }
data_frame2  = pd.DataFrame(data=d2)
data_frame2

我想做的是:
1.在data_frame中,我错过了2003年的观察,因此我想复制包含2002(最早可用的年份)的行(data_frame[data_frame['year']==2002]),将其附加到我的data_frame中,并将2002替换为2003。其余保持不变。
1.在data_frame1中,我错过了2000年的观测值,我想做与1中相同的事情,但在这种情况下,我想使用包含2001年的行。
1.至于data_frame2,我没有2001年的观测数据,这里我想使用最早的年份,即2000年。
有没有什么方法可以做到这一点,而不需要分别检查每个 Dataframe ,而是编写一些通用函数?

  • 谢谢-谢谢
pqwbnv8z

pqwbnv8z1#

使用DataFrame.reindex与参数method='nearest'配合使用所有年份,但对于data_frame2则使用下一年:

dfs = [data_frame,data_frame1, data_frame2]

for df in dfs:
    df = df.set_index('year').reindex(range(2000, 2004), method='nearest')
    print (df)
         name  value
    year            
    2000    a     10
    2001    a     17
    2002    a     22
    2003    a     22
         name  value
    year            
    2000    a     10
    2001    a     10
    2002    a     17
    2003    a     22
         name  value
    year            
    2000    a     10
    2001    a     17
    2002    a     17
    2003    a     22

如果需要上一年如果存在,最后一年替换下一年用途:

for df in dfs:
    df = df.set_index('year').reindex(range(2000, 2004), method='ffill').bfill()
    print (df)
         name  value
    year            
    2000    a     10
    2001    a     17
    2002    a     22
    2003    a     22
         name  value
    year            
    2000    a   10.0
    2001    a   10.0
    2002    a   17.0
    2003    a   22.0
         name  value
    year            
    2000    a     10
    2001    a     10
    2002    a     17
    2003    a     22

每组溶液:

for df in dfs:
    df = (df.set_index('year').groupby('name', group_keys=False)
            .apply(lambda x: x.reindex(range(2000, 2004), method='ffill').bfill()))
    print (df)
         name  value
    year            
    2000    a     10
    2001    a     17
    2002    a     22
    2003    a     22
         name  value
    year            
    2000    a   10.0
    2001    a   10.0
    2002    a   17.0
    2003    a   22.0
         name  value
    year            
    2000    a     10
    2001    a     10
    2002    a     17
    2003    a     22

相关问题