Python 转换长数据帧并提取字符串

Python 转换长数据帧并提取字符串,python,pandas,dataframe,Python,Pandas,Dataframe,嗨,我有这样的数据帧: Date A_2002 B_2003 C_2004 D_2005 Type 03-2002 20 30 12 42 X 04-2002 12 321 12 23 X 03-2002 10 31 2 3 Y 我想将其转换为长版本,并从中提取字符串类型,因此最终结果如下: Date NewCol Extracted Type Value 03-2002

嗨,我有这样的数据帧:

    Date A_2002 B_2003 C_2004 D_2005 Type
03-2002   20     30      12     42    X
04-2002   12     321     12     23    X
03-2002   10     31      2      3     Y
我想将其转换为长版本,并从中提取字符串类型,因此最终结果如下:

   Date NewCol Extracted Type Value
03-2002 A       2002      X    20
03-2002 B       2003      X    30
03-2002 C       2004      X    12
03-2002 D       2005      X    42
04-2002 A       2002      X    12
04-2002 B       2003      X    321
04-2002 C       2004      X    12
04-2002 D       2005      X    23
03-2002 A       2002      Y    10
03-2002 B       2003      Y    31
03-2002 C       2004      Y    2
03-2002 D       2005      Y    3
因此,最终结果将把列名中的值转换为两个新值,并如上所示融合数据。熊猫有可能吗?

我们可以在这里使用:


您可以在
set_index
str.split
之后执行
stack

m = df.set_index(['Date','Type'])
m.columns = m.columns.str.split('_',expand=True)
out = (m.stack([0,1]).rename('Value').reset_index()
     .rename(columns={'level_2':'NewCol','level_3':'Extracted'}))


这里有一种从
pd.wide\u到
的方法。好的一点是,wide-to-long将
'Extracted'
列转换为
int64
,尽管我们需要手动指定存根,并且
值将向上转换为float

df = (pd.wide_to_long(df, i=['Date', 'Type'], j='Extracted',
                      stubnames=list('ABCD'), sep='_')
        .rename_axis('NewCol', axis=1)
        .stack()
        .rename('value')
        .reset_index())
#       Date Type  Extracted NewCol  value
#0   03-2002    X       2002      A   20.0
#1   03-2002    X       2003      B   30.0
#2   03-2002    X       2004      C   12.0
#3   03-2002    X       2005      D   42.0
#4   04-2002    X       2002      A   12.0
#5   04-2002    X       2003      B  321.0
#6   04-2002    X       2004      C   12.0
#7   04-2002    X       2005      D   23.0
#8   03-2002    Y       2002      A   10.0
#9   03-2002    Y       2003      B   31.0
#10  03-2002    Y       2004      C    2.0
#11  03-2002    Y       2005      D    3.0

df.dtypes
#Date          object
#Type          object
#Extracted      int64
#NewCol        object
#value        float64
       Date Type NewCol Extracted  Value
0   03-2002    X      A      2002   20.0
1   03-2002    X      B      2003   30.0
2   03-2002    X      C      2004   12.0
3   03-2002    X      D      2005   42.0
4   04-2002    X      A      2002   12.0
5   04-2002    X      B      2003  321.0
6   04-2002    X      C      2004   12.0
7   04-2002    X      D      2005   23.0
8   03-2002    Y      A      2002   10.0
9   03-2002    Y      B      2003   31.0
10  03-2002    Y      C      2004    2.0
11  03-2002    Y      D      2005    3.0
df = (pd.wide_to_long(df, i=['Date', 'Type'], j='Extracted',
                      stubnames=list('ABCD'), sep='_')
        .rename_axis('NewCol', axis=1)
        .stack()
        .rename('value')
        .reset_index())
#       Date Type  Extracted NewCol  value
#0   03-2002    X       2002      A   20.0
#1   03-2002    X       2003      B   30.0
#2   03-2002    X       2004      C   12.0
#3   03-2002    X       2005      D   42.0
#4   04-2002    X       2002      A   12.0
#5   04-2002    X       2003      B  321.0
#6   04-2002    X       2004      C   12.0
#7   04-2002    X       2005      D   23.0
#8   03-2002    Y       2002      A   10.0
#9   03-2002    Y       2003      B   31.0
#10  03-2002    Y       2004      C    2.0
#11  03-2002    Y       2005      D    3.0

df.dtypes
#Date          object
#Type          object
#Extracted      int64
#NewCol        object
#value        float64