将Pandas中多行数据拆分成新列

3
我有一个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          
4个回答

3

这不是最好的解决方案,但在你找到更好的方案之前可以采用它。

#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']

result


2
尝试这样做:
将不是“薪资”或“奖金”的行移动到另一列,然后您可以重塑和聚合。
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

1

@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)


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()

output

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接