如何在Python中转换或融合列?

4

我有一个表格,但是我想把它变成一个简单的表单。现有的表格长这样:

group      mp_current   mh_current   mp_total   mh_total 
contractor       25         4825        0          0

我想将表格转换为这种形式:
group        mp    mh    period
contractor   25   4825   current
contractor   0      0    total

我希望有一个专门的mp和mh列,以及一个额外的期间列。

我该如何在Python中执行此操作?

2个回答

8

wide_to_long

使用wide_to_long函数,你可以指定列前缀(即“桩名”)、分隔符('_'),并且默认情况下期望数值的后缀为任意字符('.*')。j参数代表分隔符之后的值所在的列标签。i参数引用的列需要能够唯一地标识每一行。

df1 = (pd.wide_to_long(df, i='group', j='period', 
                       stubnames=['mh', 'mp'], sep='_', suffix='.*')
         .reset_index())

        group   period    mh  mp
0  contractor  current  4825  25
1  contractor    total     0   0

3

如前一个解决方案所提供的,wide_to_long可很好地解决此问题。 另一种选择是使用pyjanitor库中的pivot_longer函数(它们只是pandas函数/方法的封装器):

# pip install pyjanitor
import pandas as pd
import janitor
df.pivot_longer(index='group', 
                names_to=('.value', 'period'), 
                names_sep='_')
 
        group   period  mp    mh
0  contractor  current  25  4825
1  contractor    total   0     0
.value是一个指标(类似于wide_to_long中的stubnames,但更加灵活),提示pivot_longer保留与其相关联的列名称部分作为标题,而其他部分则被收集到period列中。由于列部分是由_分隔的,因此在names_sep参数中使用它。 .value可以是列名的任何部分,只要您可以使用正则表达式(names_pattern)或定界符(names_sep)轻松识别它。
您还可以使用stack方法完成这项工作,其中设置索引,拆分列,堆叠相关级别,最后重新设置索引。
df = df.set_index('group')
df.columns = df.columns.str.split('_', expand = True)
df.columns.names = [None, 'period']
df.stack(-1).reset_index()
 
        group   period    mh  mp
0  contractor  current  4825  25
1  contractor    total     0   0

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