将数据从多行拆分为 Pandas 中的新列

Splitting data form multiple rows into a new column in Pandas

我有一个 Pandas 数据框,其中包含以下格式的单列混合值:

      EmpNo          Amount

      01-A           22150
      Salary         22000
      Bonus          150

      02-B           20500
      Salary         20000
      Bonus          500

      03-C           15150
      Salary         15000
      Bonus          150

如何按照以下格式将数据分成不同的列?


      EmpNo            Salary          Bonus          Total
      01-A             22000           150            22150
      02-B             20000           500            20500
      03-C             15000           150            15150          

不是最好的解决方案,但您可以继续使用,直到找到更好的解决方案。

#data
index = ['01-A', 'Salary', 'Bonus', '02-B', 'Salary', 'Bonus']
amount = [22150, 22000, 150, 20500, 20000, 500]
df = pd.DataFrame(amount, index)

#extract data per variable
salary = df[df.index == 'Salary '].reset_index()
bonus = df[df.index == 'Bonus'].reset_index()
total = df[(df.index != 'Salary ') & (df.index != 'Bonus')].reset_index()

dfnew = pd.concat([salary[0], bonus[0], total[0]], axis=1)
dfnew.columns = ['salary', 'bonus', 'total']
dfnew.index = total['index']

试试这个:

将不是SalaryBonus的行移动到另一列,然后你可以重新整形和聚合

df["index"] = np.where(df.EmpNo.str.contains("-"), df.EmpNo, np.nan)
df["index"] = df["index"].ffill()
df = df.query("EmpNo != index").pivot("index", "EmpNo", "Amount")
df["total"] = df.sum(1)
df


EmpNo   Bonus   Salary  total
index           
01-A    150 22000   22150
02-B    500 20000   20500
03-C    150 15000   15150

@sammywemmy 给出了很好的回答

也请查看下面的代码。考虑 EmpNo 个值按顺序

new_df = pd.DataFrame({
    'EmpNo': df[df.index % 3 == 0]['EmpNo'].values,
    'Salary': df[df.index % 3 == 1]['Amount'].values,
    'Bonus': df[df.index % 3 == 2]['Amount'].values
})
new_df['Total'] = new_df.loc[:, ['Salary', 'Bonus']].sum(axis=1)

另一种方法

a = df.unstack().reset_index(drop=True).to_frame(name='EmpNo')
new_df = a.iloc[0:7:3,:].copy()
new_df ['total'] = a.iloc[9::3,:].to_numpy().copy()
new_df ['Bonus'] = a.iloc[10::3,:].to_numpy().copy()
new_df ['Salary'] = a.iloc[11::3,:].to_numpy().copy()

输出

EmpNo   total   Bonus   Salary
01-A    22150   22000   150
02-B    20500   20000   500
03-C    15150   15000   150