Muz*_*uzz 1 python dataframe pandas
我有一个这样的数据框:
df1
sample x data data y
b a
d c
f e
h g
j i
l k
Run Code Online (Sandbox Code Playgroud)
我需要像这样创建一个新的数据框:
information identifier
b x
d x
f x
h x
j x
l x
a y
c y
e y
g y
i y
k y
Run Code Online (Sandbox Code Playgroud)
这可以在熊猫中完成吗?这就像将一列堆叠在另一列之上,但要记录该列是什么类型的信息。非常感谢。
str.split按列名使用,然后通过重新整形DataFrame.unstack,最后通过DataFrame.reset_index以下方式进行一些数据清理:
#first data solution
df.columns = df.columns.str.split('_', expand=True)
df = (df.unstack()
.reset_index(level=[1,2], drop=True)
.rename_axis('identifier')
.reset_index(name='data')[['data','identifier']])
print (df)
data identifier
0 b x
1 d x
2 f x
3 h x
4 j x
5 l x
6 a y
7 c y
8 e y
9 g y
10 i y
11 k y
Run Code Online (Sandbox Code Playgroud)
编辑:
如果使用,melt则列名称创建新列:
df = df.melt(var_name='identifier', value_name='information')
print (df)
identifier information
0 sample x data b
1 sample x data d
2 sample x data f
3 sample x data h
4 sample x data j
5 sample x data l
6 data y a
7 data y c
8 data y e
9 data y g
10 data y i
11 data y k
Run Code Online (Sandbox Code Playgroud)
所以你可以提取值x和y:
df.columns = df.columns.str.extract('(x|y)', expand=False)
df = df.melt(var_name='identifier', value_name='information')
print (df)
identifier information
0 x b
1 x d
2 x f
3 x h
4 x j
5 x l
6 y a
7 y c
8 y e
9 y g
10 y i
11 y k
Run Code Online (Sandbox Code Playgroud)