【问题标题】:Assign Column values in groups of 3 - Python以 3 个一组分配列值 - Python
【发布时间】:2019-02-20 23:55:44
【问题描述】:

我的目标是assignpandasdf 中的人们。具体来说,我使用下面的df 来确定当前开启的地方有多少。我想以 3 个一组的形式使用这些值和 assign。

例如,出现少于 3 个的总位置应分配给 P1。 3-6的地方应该分配给P2等。

注意:一次出现的地点总数最多可达到 20 个,因此分配的组数需要适应此情况。

这是我的尝试。

import pandas as pd
import numpy as np

d = ({
    'Time' : ['8:03:00','8:07:00','8:10:00','8:23:00','8:27:00','8:30:00','8:37:00','8:40:00','8:48:00'],                 
    'Place' : ['House 1','House 2','House 3','House 4','House 5','House 1','House 2','House 3','House 4'],                                     
     })

df = pd.DataFrame(data=d)

df['u'] = df[::-1].groupby('Place').Place.cumcount()
ids = [1]
seen = set([df.iloc[0].Place])
dec = False
for val, u in zip(df.Place[1:], df.u[1:]):
    ids.append(ids[-1] + (val not in seen) - dec)
    seen.add(val)
    dec = u == 0
df['Places On'] = ids

df = df.drop(df[['u']], axis=1)

def g(gps):
        s = gps['Place'].unique()
        d = dict(zip(s, np.arange(len(s)) // 3 + 1))
        gps['P'] = gps['Place'].map(d)
        return gps

df = df.groupby('Place', sort=False).apply(g)

输出:

      Time    Place  Places On  P
0  8:03:00  House 1          1  1
1  8:07:00  House 2          2  1
2  8:10:00  House 3          3  1
3  8:23:00  House 4          4  1
4  8:27:00  House 5          5  1
5  8:30:00  House 1          4  1
6  8:37:00  House 2          3  1
7  8:40:00  House 3          2  1
8  8:48:00  House 4          1  1

预期输出:

      Time    Place  Places On  P
0  8:03:00  House 1          1  1
1  8:07:00  House 2          2  1
2  8:10:00  House 3          3  1
3  8:23:00  House 4          4  2
4  8:27:00  House 5          5  2
5  8:30:00  House 1          4  2
6  8:37:00  House 2          3  1
7  8:40:00  House 3          2  1
8  8:48:00  House 4          1  1

【问题讨论】:

    标签: python pandas numpy dataframe assign


    【解决方案1】:
    import pandas as pd
    import numpy as np
    
    d = ({
        'Time' : ['8:03:00','8:07:00','8:10:00','8:23:00','8:27:00','8:30:00','8:37:00','8:40:00','8:48:00'],                 
        'Place' : ['House 1','House 2','House 3','House 4','House 5','House 1','House 2','House 3','House 4'],                                     
         })
    
    df = pd.DataFrame(data=d)
    
    df['u'] = df[::-1].groupby('Place').Place.cumcount()
    ids = [1]
    seen = set([df.iloc[0].Place])
    dec = False
    for val, u in zip(df.Place[1:], df.u[1:]):
        ids.append(ids[-1] + (val not in seen) - dec)
        seen.add(val)
        dec = u == 0
    df['Places On'] = ids
    
    df = df.drop(df[['u']], axis=1)
    
    def g(gps):
            s = gps['Place'].unique()
            d = dict(zip(s, np.arange(len(s)) // 3 + 1))
            gps['P'] = gps['Place'].map(d)
            return gps
    
    df = df.groupby('Place', sort=False).apply(g)
    
    for i in range(df.shape[0]):
        if(df['Places On'][i]<=3):
            df['P'][i]=1
        else:
            df['P'][i]=2
    print(df)
    

    这应该基于对 df['Places On'] 的排序工作。

    【讨论】:

    • Gotimulul,这需要更动态的抱歉。发生的地点数量最多可达到 20 个。因此,分配的组需要为此提供适应。
    猜你喜欢
    • 2017-12-23
    • 2012-11-19
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多