将数据从多行拆分为 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']
试试这个:
将不是Salary
或Bonus
的行移动到另一列,然后你可以重新整形和聚合
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
我有一个 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']
试试这个:
将不是Salary
或Bonus
的行移动到另一列,然后你可以重新整形和聚合
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