如何透视Pandas表的某些列

6tqwzwtp  于 2023-01-24  发布在  其他
关注(0)|答案(1)|浏览(116)

我在Pandas中有一个数据名,它有一组带连字符的列(有几个,但我将使用2作为示例,_1和_2),这两个列都描述了不同的年份。

df = pd.DataFrame({'A': ['BP','Virgin'],
                   'B(LY)': ['A','C'],
                   'B(LY_1)': ['B', 'D'],
                   'C': [1, 3],
                   'C_1': [2,4],
                   'D': ['W','Y'],
                   'D_1': ['X','Z']})

我正在尝试重新组织表以透视它,使它看起来像这样:

df = pd.DataFrame({'A': ['BP','BP', 'Virgin', 'Virgin'],
                   'Year': ['A','B','C','D'],
                   'C': [1,2,3,4],
                   'D': ['W','X','Y','Z']})

但是我不知道怎么做。问题是,我只需要连字符列来匹配其他变量的等价连字符。任何帮助都是感激的,谢谢

    • 编辑**

下面是一个真实的数据示例

df = pd.DataFrame({'Company': ['BP','Virgin'],
                   'Account_date(LY)': ['A','E'],
                   'Account_date(LY_1)': ['B', 'F'],
                   'Account_date(LY_2)': ['C', 'G'],
                   'Account_date(LY_3)': ['D', 'H'],
                   'Acc_months': [1, 5],
                   'Acc_months_1': [2,6],
                   'Acc_months_2': [3,7],
                   'Acc_months_2': [4,8],
                   'D': ['W','A'],
                   'D_1': ['X','B'],
                   'D_1': ['Y','C'],
                   'D_1': ['Z','D']})

期望输出:

df = pd.DataFrame({'Company': ['BP','BP','BP','BP', 'Virgin', 'Virgin','Virgin', 'Virgin'],
                   'Year': ['A','B','C','D','E','F','G','H'],
                   'C': [1,2,3,4,5,6,7,8],
                   'D': ['W','X','Y','Z','A','B','C','D']})
pu82cl6c

pu82cl6c1#

您可以使用:

# set A aside
df2 = df.set_index('A')
# split columns to MultiIndex on "_"
df2.columns = df2.columns.str.split('_', expand=True)

# reshape
out = df2.stack().droplevel(1).rename(columns={'B': 'Year'}).reset_index()

或者使用看门人的pivot_longer

import janitor

out = (df.pivot_longer(index='A', names_sep='_', names_to=('.value', '_drop'), sort_by_appearance=True)
         .rename(columns={'B': 'Year'}).drop(columns='_drop')
      )

输出:

A Year  C  D
0      BP    A  1  W
1      BP    B  2  X
2  Virgin    C  3  Y
3  Virgin    D  4  Z
更新示例

使用Map器来匹配(LY)-〉_1等。

import re

# you can generate this mapper programmatically if needed
mapper = {'(LY)': '_1', '(LY-1)': '_2'}

# set A aside
df2 = df.set_index('A')
# split columns to MultiIndex on "_"
pattern = '|'.join(map(re.escape, mapper))
df2.columns = df2.columns.str.replace(pattern, lambda m: mapper[m.group()], regex=True).str.split('_', expand=True)

# reshape
out = df2.stack().droplevel(1).rename(columns={'B': 'Year'}).reset_index()

输出:

A Year  C  D
0      BP    A  1  W
1      BP    B  2  X
2  Virgin    C  3  Y
3  Virgin    D  4  Z

相关问题