【问题标题】:pandas conditionally assign values to new column based on value of a datetimeindexpandas 根据 datetimeindex 的值有条件地将值分配给新列
【发布时间】:2019-04-29 16:09:03
【问题描述】:

我正在尝试使用 pandas 数据框的 datetimeindex 来分配一个名为“season”的新列。

winter =[12,1,2]
spring =[3,4,5]
summer =[6,7,8]
autumn =[9,10,11]

DTX_index = [datetime(2017, 2, 1).date(), datetime(2017, 3, 1).date(), datetime(2017, 6, 1).date(), datetime(2017, 9, 1).date()]
DTX_index = pd.to_datetime(DTX_index, utc=True)
df = pd.DataFrame(index=DTX_index)

我希望是这样的:

                           season
2017-02-01 00:00:00+00:00   winter
2017-03-01 00:00:00+00:00   spring
2017-06-01 00:00:00+00:00   summer
2017-09-01 00:00:00+00:00   autumn

分配一个月

df['month'] = df.index.month

为单个季节分配布尔值

df['season'] = df.index.month.isin([12,1,2])

我不确定如何在整个 df 中根据月份分配季节?我尝试了一个应用功能:

def add_season(x):

    if x.index.month.isin([12,1,2]):
        return 'winter'
    elif x.index.month.isin([3,4,5]):
        return 'spring'
    elif x.index.month.isin([6,7,8]):
        return 'summer'
    elif x.index.month.isin([9,10,11]):
        return 'autumn'

df['season'] = df.apply(add_season)

但这会返回一个值错误:

ValueError: ('The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()', 'occurred at index season')

大概是因为该函数是在整个系列上运行,而不是在元素上运行。

我敢肯定,在应用函数方面比我有更多经验的人可以很快解决这个问题?

非常感谢

【问题讨论】:

    标签: python pandas datetime apply datetimeindex


    【解决方案1】:

    IIUC

    d={**dict.fromkeys(winter,'winter'),**dict.fromkeys(spring,'spring'),**dict.fromkeys(summer,'summer'),**dict.fromkeys(autumn,'autumn')}
    df['Value']=list(map(d.get,df.index.month))
    df
    Out[697]: 
                                Value
    2017-02-01 00:00:00+00:00  winter
    2017-03-01 00:00:00+00:00  spring
    2017-06-01 00:00:00+00:00  summer
    2017-09-01 00:00:00+00:00  autumn
    

    【讨论】:

    • 我以前没有见过这种构建字典的方法,所以感谢发帖! - 它的可读性比其他答案略低,所以我已经同意了,谢谢!
    【解决方案2】:

    您可以创建一个映射框架并使用map。为使其正常工作,季节应包含不同的月份。


    u = pd.DataFrame().assign(
        winter=winter, spring=spring, summer=summer, autumn=autumn
    ).melt().set_index('value')
    
    df.assign(month=df.index.month.map(u.variable))
    

                                month
    2017-02-01 00:00:00+00:00  winter
    2017-03-01 00:00:00+00:00  spring
    2017-06-01 00:00:00+00:00  summer
    2017-09-01 00:00:00+00:00  autumn
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-06
      • 2016-04-15
      • 1970-01-01
      • 2021-09-22
      • 2019-02-12
      • 1970-01-01
      • 2016-11-23
      • 2021-04-30
      相关资源
      最近更新 更多