Python 数据帧:将2列(值、值)转换为2列(值、类型)
假设我有以下数据帧“A” 我需要将其转换为以下数据帧“B” 因此,第一列中的值被分类为类型列,值为total或billablePython 数据帧:将2列(值、值)转换为2列(值、类型),python,pandas,Python,Pandas,假设我有以下数据帧“A” 我需要将其转换为以下数据帧“B” 因此,第一列中的值被分类为类型列,值为total或billable data = { 'utilization': [10.0, 30.0, 40.0, 40.0], 'utilization_billable': [5.0, 20.0, 30.0, 32.0], 'service': [1, 2, 3, 4] } df = pd.DataFrame.from_dict(data).set_index('serv
data = {
'utilization': [10.0, 30.0, 40.0, 40.0],
'utilization_billable': [5.0, 20.0, 30.0, 32.0],
'service': [1, 2, 3, 4]
}
df = pd.DataFrame.from_dict(data).set_index('service')
print(df)
data = {
'utilization': [10.0, 30.0, 40.0, 40.0, 5.0, 20.0, 30.0, 32.0],
'service': [1, 2, 3, 4, 1, 2, 3, 4],
'type': [
'total',
'total',
'total',
'total',
'billable',
'billable',
'billable',
'billable',
]
}
df = pd.DataFrame.from_dict(data).set_index('service')
print(df)
有没有一种方法可以转换数据帧并执行此类分类?看起来像是
df.stack()
的作业,其中包含多个DataFrame.rename()
输出:
type utilization
service
1 total 10.0
2 total 30.0
3 total 40.0
4 total 40.0
1 billable 5.0
2 billable 20.0
3 billable 30.0
4 billable 32.0
这可以通过在第一列添加后缀后使用
pd.wide\u to_long
来完成
import pandas as pd
df = df.rename(columns={'utilization': 'utilization_total'})
pd.wide_to_long(df.reset_index(), stubnames='utilization', sep='_',
i='service', j='type', suffix='.*').reset_index(1)
输出:
您可以使用:
屈服
service type utilization
0 1 utilization 10.0
1 2 utilization 30.0
2 3 utilization 40.0
3 4 utilization 40.0
4 1 utilization_billable 5.0
5 2 utilization_billable 20.0
6 3 utilization_billable 30.0
7 4 utilization_billable 32.0
然后result.set_index('service')
将使service
成为索引,
但我建议避免这种情况,因为
服务
值不是唯一的。另一种语法是melt
。使用pd.DataFrame.melt
而不是像这样使用pd.melt
:df.reset_index().melt('service',var_name='type')。set_index('service')
type utilization
service
1 total 10.0
2 total 30.0
3 total 40.0
4 total 40.0
1 billable 5.0
2 billable 20.0
3 billable 30.0
4 billable 32.0
import pandas as pd
df = df.rename(columns={'utilization': 'utilization_total'})
pd.wide_to_long(df.reset_index(), stubnames='utilization', sep='_',
i='service', j='type', suffix='.*').reset_index(1)
type utilization
service
1 total 10.0
2 total 30.0
3 total 40.0
4 total 40.0
1 billable 5.0
2 billable 20.0
3 billable 30.0
4 billable 32.0
import pandas as pd
data = {
'utilization': [10.0, 30.0, 40.0, 40.0],
'utilization_billable': [5.0, 20.0, 30.0, 32.0],
'service': [1, 2, 3, 4]}
df = pd.DataFrame(data)
result = pd.melt(df, var_name='type', value_name='utilization', id_vars='service')
print(result)
service type utilization
0 1 utilization 10.0
1 2 utilization 30.0
2 3 utilization 40.0
3 4 utilization 40.0
4 1 utilization_billable 5.0
5 2 utilization_billable 20.0
6 3 utilization_billable 30.0
7 4 utilization_billable 32.0