微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

删除列名的后缀并取消透视

如何解决删除列名的后缀并取消透视

我想使用列名称“Year”、“Item”和“$”对下表进行逆透视。我的解决方法是将表分成两个数据框并删除后缀,然后垂直连接两列。有没有其他更简单的方法解决这个问题?

示例数据框:

data = {'Year_x': [1993,1994,1995,1996],'Year_y': [2000,2001,2002,2003],'Item_x':['A','B','C','D'],'Item_y':['E','F','G','H'],'$':[3,4,5,6]}

pd.DataFrame.from_dict(data)
Year_x Year_y Item_x Item_y $
1993 2000 A E 3
1994 2001 B F 4
1995 2002 C G 5
1996 2003 D H 6

我想要达到的目标:

年份 项目 $
1993 A 3
1994 B 4
1995 C 5
1995 D 6
2000 E 3
2001 F 4
2002 G 5
2003 H 6

解决方法

使用 DataFrame.set_index 将没有分隔符的列 _ 转换为索引,然后将列名称拆分为 MultiIndex :

cols = ['$']
#if multiple columns
cols = ['$','$Column1','$Column2']
df1 = df.set_index(cols)

df1.columns = df1.columns.str.split('_',expand=True)
df1 = (df1.stack()
          .sort_values(['Item','Year'])
          .reset_index()[['Year','Item'] + cols])
print (df1)
   Year Item  $
0  1993    A  3
1  1994    B  4
2  1995    C  5
3  1996    D  6
4  2000    E  3
5  2001    F  4
6  2002    G  5
7  2003    H  6
,

与列表理解的串联

>>> pd.concat([df[["Year_" + c,"Item_" + c,"$"]].rename({"Year_" + c : "Year","Item_" + c : "Item"},axis=1) for c in ("x","y")]).reset_index(drop=True)
   Year Item  $
0  1993    A  3
1  1994    B  4
2  1995    C  5
3  1996    D  6
4  2000    E  3
5  2001    F  4
6  2002    G  5
7  2003    H  6

或者,通过pd.wide_to_long(...)

>>> pd.wide_to_long(df,["Year","Item"],i=["$"],j="Var",sep="_",suffix="\w+").reset_index()
   $ Var  Year Item
0  3   x  1993    A
1  4   x  1994    B
2  5   x  1995    C
3  6   x  1996    D
4  3   y  2000    E
5  4   y  2001    F
6  5   y  2002    G
7  6   y  2003    H
,
  • step1,找到列的后缀
df_col = pd.DataFrame(df.columns.str.split('_').tolist())
df_col['col'] = df.columns.tolist()
print(df_col)

    #       0     1     col
    # 0  Year     x  Year_x
    # 1  Year     y  Year_y
    # 2  Item     x  Item_x
    # 3  Item     y  Item_y
    # 4     $  None       $
  • step2,处理输出列
cond =  df_col[1].isnull()
cols_without_subfix = df_col.loc[cond,'col'].tolist()
obj = df_col[~cond].groupby(1)['col'].agg(list)
obj = obj.map(lambda x: x + cols_without_subfix)
print(obj)

    # 1
    # x    [Year_x,Item_x,$]
    # y    [Year_y,Item_y,$]
    # Name: col,dtype: object
  • step3,迭代输出列并连接它们。
df_list = []
for i in obj:
    dfn = df[i]
    dfn.columns = dfn.columns.str.split('_').str[0]
    df_list.append(dfn)
df_output = pd.concat(df_list)    
print(df_output)

    #    Year Item  $
    # 0  1993    A  3
    # 1  1994    B  4
    # 2  1995    C  5
    # 3  1996    D  6
    # 0  2000    E  3
    # 1  2001    F  4
    # 2  2002    G  5
    # 3  2003    H  6

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?