Python 在熊猫中使用groupby、transpose、append或pivot的哪些功能?如何使用它们?

Python 在熊猫中使用groupby、transpose、append或pivot的哪些功能?如何使用它们?,python,pandas,pivot,pandas-groupby,Python,Pandas,Pivot,Pandas Groupby,我有一个熊猫数据框,如下所示: df_starting_point = pd.DataFrame( [{'robot_id': 130, 'work_id': 1, 'grade': '1', 'time' : 1}, {'robot_id': 141, 'work_id': 2, 'grade': '3', 'time' : 1}, {'robot_id':

我有一个熊猫数据框,如下所示:

df_starting_point = pd.DataFrame(
                      [{'robot_id': 130, 'work_id': 1, 'grade': '1', 'time' : 1},
                       {'robot_id': 141, 'work_id': 2, 'grade': '3', 'time' : 1},
                       {'robot_id': 141, 'work_id': 60, 'grade': '4', 'time' : 1},
                       {'robot_id': 17013, 'work_id': 1, 'grade': '1', 'time' : 1},
                       {'robot_id': 17013, 'work_id': 1478, 'grade': '5', 'time' : 1},
                       {'robot_id': 17013, 'work_id': 1478, 'grade': '4', 'time' : 2},
                       {'robot_id': 17013, 'work_id': 230, 'grade': '2', 'time' : 1},
                       {'robot_id': 130, 'work_id': 123, 'grade': '1', 'time' : 1},
                       {'robot_id': 17013, 'work_id': 2, 'grade': '2', 'time' : 1}
                      ])
df_end_point = pd.DataFrame(
                  [{'robot_id': 130, '1': 1, '2': np.nan, '60': np.nan, '123': 1, '230': np.nan, '1478': np.nan},
                   {'robot_id': 141, '1': np.nan, '2': 3, '60': 4, '123': np.nan, '230': np.nan, '1478': np.nan},
                   {'robot_id': 17013, '1': 1, '2': 2 , '60': np.nan, '123': np.nan, '230': 2, '1478': 4},
                  ])
我想用它创建一个数据帧,如下所示:

df_starting_point = pd.DataFrame(
                      [{'robot_id': 130, 'work_id': 1, 'grade': '1', 'time' : 1},
                       {'robot_id': 141, 'work_id': 2, 'grade': '3', 'time' : 1},
                       {'robot_id': 141, 'work_id': 60, 'grade': '4', 'time' : 1},
                       {'robot_id': 17013, 'work_id': 1, 'grade': '1', 'time' : 1},
                       {'robot_id': 17013, 'work_id': 1478, 'grade': '5', 'time' : 1},
                       {'robot_id': 17013, 'work_id': 1478, 'grade': '4', 'time' : 2},
                       {'robot_id': 17013, 'work_id': 230, 'grade': '2', 'time' : 1},
                       {'robot_id': 130, 'work_id': 123, 'grade': '1', 'time' : 1},
                       {'robot_id': 17013, 'work_id': 2, 'grade': '2', 'time' : 1}
                      ])
df_end_point = pd.DataFrame(
                  [{'robot_id': 130, '1': 1, '2': np.nan, '60': np.nan, '123': 1, '230': np.nan, '1478': np.nan},
                   {'robot_id': 141, '1': np.nan, '2': 3, '60': 4, '123': np.nan, '230': np.nan, '1478': np.nan},
                   {'robot_id': 17013, '1': 1, '2': 2 , '60': np.nan, '123': np.nan, '230': 2, '1478': 4},
                  ])
df\u起点中

  • 每个机器人id都有多个不同工作id的条目
  • 每项完成的工作都将被评分
  • 机器人id可以完成工作id多次。因此,一个机器人id可以对同一个工作id拥有多个等级
对于df_end_point我希望:

  • 每个唯一的机器人id对应一行
  • 每个发生的工作id有一列,其中工作id是标签
  • 输入相应的等级。如果存在多个等级,则应将时间中数量最多的等级居中
我已经尝试了几个panda函数,但是我正在努力获得想要的结果,我不确定我的方法是否合理。我在这里也发现了一些类似的问题,但我无法将它们应用到我的问题中

我如何在熊猫身上做到这一点?有没有一种优雅的方法? 你能不能请你解释一下你在做什么


多谢各位。非常感谢您的帮助。

我们的想法是,在分组后,只过滤时间最长的行,然后转换为整数,这样在另一次分组后,可以通过求和填充空单元格

(
    df_starting_point.set_index(["robot_id", "work_id"], append=True)
    .assign(temp=lambda x: x.groupby(["robot_id", "work_id"]).time.transform("max"))
    .query("time==temp")
    .drop(["time", "temp"], axis=1)
    .astype(int)
    .unstack()
    .groupby("robot_id")
    .sum(min_count = 1)
)


                                  grade
work_id  1     2    60    123   230 1478
robot_id                        
130     1.0   NaN   NaN   1.0   NaN   NaN
141     NaN   3.0   4.0   NaN   NaN   NaN
17013   1.0   2.0   NaN   NaN   2.0   4.0

其思想是在分组后,仅对时间最长的行进行过滤,然后转换为整数,以便在另一次按和分组后填充空单元格

(
    df_starting_point.set_index(["robot_id", "work_id"], append=True)
    .assign(temp=lambda x: x.groupby(["robot_id", "work_id"]).time.transform("max"))
    .query("time==temp")
    .drop(["time", "temp"], axis=1)
    .astype(int)
    .unstack()
    .groupby("robot_id")
    .sum(min_count = 1)
)


                                  grade
work_id  1     2    60    123   230 1478
robot_id                        
130     1.0   NaN   NaN   1.0   NaN   NaN
141     NaN   3.0   4.0   NaN   NaN   NaN
17013   1.0   2.0   NaN   NaN   2.0   4.0

首先,谢谢,它似乎起作用了。有没有办法用pivot做到这一点?在我看来,这个函数是为像我这样的用例设计的。
pivot
在单个索引上工作;此外,使用pivot,您将无法筛选
时间为
max``的行。首先,谢谢,它似乎可以工作。有没有办法用pivot做到这一点?在我看来,这个函数是为像我这样的用例设计的。
pivot
在单个索引上工作;此外,使用pivot,您将无法筛选
时间为
最大值的行``