【问题标题】:How to get a value from a row that is next day in Python Pandas?如何从 Python Pandas 中第二天的行中获取值?
【发布时间】:2021-10-08 03:42:46
【问题描述】:

我正在尝试从另一行获取一个值,即每个人的“第二天”数据。假设我有这个示例数据集:

import pandas as pd    
data= {'date' : [20210701, 20210703, 20210704, 20210703, 20210705, 20210705],
    'name': ['Dave', 'Dave', 'Dave', 'Sue', 'Sue', 'Ann'],
     'a' : [1,0,1,1,1,0]}

df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')

我正在尝试创建另一列,其值为第二天的“a”列。

所以,我创建了一个“next_day”列:

df['next_date'] = df['date'] + pd.Timedelta(days=1)

但我被困在下一步了。

最终的数据框应如下所示:

import pandas as pd    
data= {'date' : [20210701, 20210703, 20210704, 20210703, 20210704, 20210705],
    'name': ['Dave', 'Dave', 'Dave', 'Sue', 'Sue', 'Ann'],
     'a' : [1,0,1,1,1,0],
'new_column' : [np.nan, 1, np.nan, 1, np.nan, np.nan ]}

df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')

如您所见,新列为每个人取第二天的值,为没有数据的人取 NaN。

【问题讨论】:

    标签: python pandas date


    【解决方案1】:

    这似乎有效:

            date  name  a  next_date
    0 2021-07-01  Dave  1 2021-07-02
    1 2021-07-03  Dave  0 2021-07-04
    2 2021-07-04  Dave  1 2021-07-05
    3 2021-07-03   Sue  1 2021-07-04
    4 2021-07-05   Sue  1 2021-07-06
    5 2021-07-05   Ann  0 2021-07-06
    
    df['next_date'] = df['next_date'].apply(lambda x:df.loc[df.date==x, 'a'])
    
            date  name  a  next_date
    0 2021-07-01  Dave  1        NaN
    1 2021-07-03  Dave  0        1.0
    2 2021-07-04  Dave  1        NaN
    3 2021-07-03   Sue  1        1.0
    4 2021-07-05   Sue  1        NaN
    5 2021-07-05   Ann  0        NaN
    

    更新:考虑到“姓名”

    这是一个解决方案——为了也考虑名称,我们可以将一个函数应用于整个数据框。因为比较复杂,先定义一下,

    def get_next_a(x):
        # get the relevant rows
        values = df.loc[(df['name']==x['name']) & (df.date==x.next_date), 'a']
    
        # return the first truthy value or np.nan if no match is found
        return next((v for v in values), np.nan)
    

    然后应用它:

    df['new_column'] = df.apply(get_next_a, axis=1)
    

    【讨论】:

    • 我认为它没有考虑“名称”列。我会用你的答案多玩一点,让名字发挥作用
    【解决方案2】:

    您可以使用 numpy where 来检查想要的条件,并使用 df.shift 来获取下一行值:

    df['new_column'] = np.where(((df['name'].shift(-1)==df['name']) & 
                          (df['next_date']==df['date'].shift(-1))), df['a'].shift(-1), np.nan)
    

    【讨论】:

      猜你喜欢
      • 2019-02-27
      • 2022-08-09
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      相关资源
      最近更新 更多