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