【问题标题】:How to populate a df column based on coditions that are number ranges如何根据数字范围的条件填充 df 列
【发布时间】:2022-11-14 19:56:15
【问题描述】:

当列 df['values'] 的值小于 x 时,我想用数字 1-52 填充列 df['category']
所以这里的值是天数,类别是周数,但不是基于日期而是天数的累积,每 7 天是一个新的一周。
周 = 1-52 的值范围
范围 = 7 的倍数 所以 7, 14, 21, ... , 371

“类别”范围为 1 - 52
“值”范围为 1 - 400

如果 df['values'] < 7,则 df['category'] = 1
如果 df['values'] < 14,则 df['category'] = 2
如果 df['values'] < 21,则 df['category'] = 3
……
否则 df['类别'] = 52

任何大于 371 天的 df['values'] 都可以认为是 df['category'] = 52

我怎么写这个?

我试过了:

week = list(range(1,53))

range = list(range(7,372,7))

for x in n:

    df.loc[(df['values'] < x), week]

并且

df['category'] = np.select((df['values'] < x), week)

我希望 df 看起来像这样:

values category
20 3
52 8

【问题讨论】:

    标签: python pandas dataframe numpy conditional-statements


    【解决方案1】:

    例子:

    df = pd.DataFrame([[20], [52], [400]], columns=['values'])
    

    df:

        values
    0   20
    1   52
    2   400
    

    使用以下代码:

    df.assign(category=df['values'].divmod(7)[0].add(1).clip(upper=52))
    

    输出:

        values  category
    0   20      3
    1   52      8
    2   400     52
    

    【讨论】:

    • 谢谢!在这种情况下,.divmod(7) 之后的 [0] 对应于“值”列,而 .add(1) 将除法结果应用于“类别”列?
    • 这似乎也有效,遵循与@Panda Kim df['category'] = np.ceil(df['values']/7) df.loc[df['category'] >52 ] = 52 类似的逻辑
    • 你可以通过查找divmod函数pandas.pydata.org/docs/reference/api/pandas.Series.divmod.html来找出[0]的含义
    • 或者你可以自己打印df['values'].divmod(7)df['values'].divmod(7)[0]
    猜你喜欢
    • 2023-01-31
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2021-07-25
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多