【问题标题】:Data manipulation in Pandas Dataframe add row for each groupPandas Dataframe 中的数据操作为每个组添加行
【发布时间】:2019-07-24 12:16:25
【问题描述】:

我想对以下数据进行数据处理。我想为经理和工人相同的每个经理在下面添加另一行。 我该怎么做?

不是:经理的一切对工人来说都是一样的。这只是我的数据集的示例场景 谢谢。

   data = [['Tom','Aurora',4500,'Shelly','Chicago',43553]
    ,['Tom','Aurora',4500,'Alex','NewYork',43654]
    ,['Tom','Aurora',4500,'Kelly','Cincinnati',44674]
    ,['Jason','Charlotte',4567,'Jimmy','Boston',44984]
    ,['Jason','Charlotte',4567,'Aaron','Austin',44583]
   ]

   # Create the pandas DataFrame 
   df = pd.DataFrame(data, columns = ['Manager','Managercity', 
   'manager_id','Worker','WorkerCity','Worker_id']) 

   # print dataframe. 
   print(df) 

下面的所需数据集

 Manager Managercity  manager_id  Worker  WorkerCity  Worker_id
    Tom      Aurora        4500  Shelly     Chicago      43553
    Tom      Aurora        4500    Alex     NewYork      43654
    Tom      Aurora        4500   Kelly  Cincinnati      44674
    Tom      Aurora        4500     Tom      Aurora       4500
  Jason   Charlotte        4567   Jimmy      Boston      44984
  Jason   Charlotte        4567   Aaron      Austin      44583
  Jason   Charlotte        4567   Jason   Charlotte       4567

谢谢

【问题讨论】:

  • 请编辑数据框创建,因为没有经理姓名 == 工人姓名的行。我什至不确定是否理解您的问题。您想创建第 4 行吗?如果是,您如何定义工人城市,因为我们不知道汤姆市...
  • 同样应该添加到worker和WorkerCity和Worker_id
  • 你输入的dataframe和想要的dataframe一样吗?

标签: python pandas data-manipulation


【解决方案1】:

尝试:

def add(gr):
    new_row = gr.iloc[0,:]
    new_row['Worker'] = new_row['Manager']
    new_row['Worker_id'] = new_row['manager_id']
    return gr.append(new_row)
df = df.groupby('Manager').apply(add).reset_index(drop = True)

您的示例数据不包含ManagerCity,但您也可以在添加功能上使用new_row['Worker_city'] = new_row['Manager_city'] 进行设置。

【讨论】:

  • 对不起,我编辑了数据集,你的函数给了我一个错误 KeyError: 'Manager'
  • @melik 你真的应该在你的列名上坚持大写或小写,否则会令人困惑,考虑到错误,你应该在我的代码上更改名称,如你定义的 Worker, Manager在您的数据上,这样您就不会收到错误
  • 很高兴我能帮上忙,编码愉快
【解决方案2】:

您可以像这样使用pd.concatdrop duplicates

data = [['Tom','Aurora',4500,'Shelly','Chicago',43553]
    ,['Tom','Aurora',4500,'Alex','NewYork',43654]
    ,['Tom','Aurora',4500,'Kelly','Cincinnati',44674]
    ,['Jason','Charlotte',4567,'Jimmy','Boston',44984]
    ,['Jason','Charlotte',4567,'Aaron','Austin',44583]
   ]

   # Create the pandas DataFrame 
df_in = pd.DataFrame(data, columns = ['Manager','Managercity', 'manager_id','Worker','WorkerCity','Worker_id']) 

df_managers = pd.DataFrame(np.tile(df_in[['Manager','Managercity','manager_id']].drop_duplicates(),2),columns=df_in.columns)
df_out = pd.concat([df_in, df_managers]).sort_values('Manager').reset_index(drop=True)
print(df_out)

输出:

  Manager Managercity manager_id  Worker  WorkerCity Worker_id
0   Jason   Charlotte       4567   Jimmy      Boston     44984
1   Jason   Charlotte       4567   Aaron      Austin     44583
2   Jason   Charlotte       4567   Jason   Charlotte      4567
3     Tom      Aurora       4500  Shelly     Chicago     43553
4     Tom      Aurora       4500    Alex     NewYork     43654
5     Tom      Aurora       4500   Kelly  Cincinnati     44674
6     Tom      Aurora       4500     Tom      Aurora      4500

【讨论】:

    猜你喜欢
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2015-09-25
    • 2022-12-22
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多