pandas 基于dataframe列值拆分数字

yebdmbv4  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(99)

我是一个新手python程序员,我手头有一个任务,需要一点逻辑设计。因此,我有一个数据框架,其中包含用户为该任务投入的用户,任务和小时数中的以下值:
| 使用者|任务|小时|
| - -----|- -----|- -----|
| 约翰|T1|八|
| 约翰|T2|三十二|
| 亚历克斯|A1|四十|
| 鲍勃|B1|十六|
现在我需要做的是,每周生成一个新的dataframe,其中包含用户,任务代码和分成5个小时的时间(每周7天中的5个工作日)。请注意,每周最多工作时间不能超过40小时,即每天8小时。

    • 对于Alex**:这个划分很简单。每天工作8小时,连续工作5天,我就有40小时的工作时间。

| 使用者|任务|小时|日|
| - -----|- -----|- -----|- -----|
| 亚历克斯|A1|八|1|
| 亚历克斯|A1|八|2|
| 亚历克斯|A1|八|3|
| 亚历克斯|A1|八|4|
| 亚历克斯|A1|八|5个|
现在事情变得棘手了。

    • 对于Bob**:除法为16/5 = 3.2。但我需要输入整数(4),并调整最后一天的剩余。

| 使用者|任务|小时|日|
| - -----|- -----|- -----|- -----|
| 鲍勃|B1| 3| 1|
| 鲍勃|B1| 3| 2|
| 鲍勃|B1| 3| 3|
| 鲍勃|B1| 3| 4|
| 鲍勃|B1| 4| 5个|

    • 约翰**:

这是最棘手的。我需要在5天内分配2个任务的小时数(32和8)。
我需要8个人分成2 - 2-2-2四天或者4 - 4两天
32分为6 - 6 - 6 - 6 - 8,5天或4 - 4 - 8 - 8 - 8,5天
考虑两种情况的第一种情况,我们会得到这样的结果:
| 使用者|任务|小时|日|
| - -----|- -----|- -----|- -----|
| 约翰|T1| 2| 1|
| 约翰|T2|六|1|
| 约翰|T1| 2| 2|
| 约翰|T2|六|2|
| 约翰|T1| 2| 3|
| 约翰|T2|六|3|
| 约翰|T1| 2| 4|
| 约翰|T2|六|4|
| 约翰|T2|八|5个|
如果我的格式或语言不合适或不遵守准则,我很抱歉。我很抱歉
如果你能帮我找出其中的逻辑,我将不胜感激。先谢谢你。

oxf4rvwz

oxf4rvwz1#

第一,import numpy as np
我们的数据框:

df = pd.DataFrame([
    ["John", "T1",8],
    ["John", "T2", 32],
    ["Alex","A1",40],
    ["Bob","B1",16]],
    columns=["User", "Task", 'Hours'])
# We create a column with the average work hours
df["avg"] = df["Hours"] / 5

# A column with the leftover hours of the first 4 days of week
df["leftover"] = (df["avg"] - np.floor(df2["avg"]) ) * 4

# We create a function, in which we will store in a list
# the working hours for each day, adding the leftovers in the 5th day.
# The elements of the list are tuples following the format (<working-hours>, <nth-day>)
def days_list(row):
    days = [(np.floor(row["avg"]), i+1) for i in range(4)]
    days.append((np.floor(row["leftover"] + row["avg"]), 5))
    return days

df["list_of_days"] = df.apply(lambda row: days_list(row), axis=1) # applying the function

# We explode the column 'list_of_days' so as to have a row for each tuple
df = df.explode("list_of_days")

# Finally, we unzip the values of each tuple in the 2 columns 'Hours' & 'Days' accordingly.
df['Hours'], df['Days'] = zip(*df["list_of_days"])

保留我们需要的列并打印Dataframe:

final_df = df[["User", "Task", "Hours", "Days"]]
final_df

| 使用者|任务|小时数|天数|
| - -----|- -----|- -----|- -----|
| 约翰|T1| 1.0| 1|
| 约翰|T1| 1.0| 2|
| 约翰|T1| 1.0| 3|
| 约翰|T1| 1.0| 4|
| 约翰|T1| 4.0| 5个|
| 约翰|T2| 6.0| 1|
| 约翰|T2| 6.0| 2|
| 约翰|T2| 6.0| 3|
| 约翰|T2| 6.0| 4|
| 约翰|T2| 8.0| 5个|
| 亚历克斯|A1| 8.0| 1|
| 亚历克斯|A1| 8.0| 2|
| 亚历克斯|A1| 8.0| 3|
| 亚历克斯|A1| 8.0| 4|
| 亚历克斯|A1| 8.0| 5个|
| 鲍勃|B1| 3.0| 1|
| 鲍勃|B1| 3.0| 2|
| 鲍勃|B1| 3.0| 3|
| 鲍勃|B1| 3.0| 4|
| 鲍勃|B1| 4.0| 5个|

相关问题