Python pandas:在宽格式 DataFrame 中转换某些变量
Python pandas: pivot certain variables in wide-form DataFrame
数据处理问题:如何从超宽的 DataFrame 中有选择地转换某些变量?
比如我想转:
df1 = pd.DataFrame(
[[1,'a','b',.1,-1,10],
[2,'a','b',.2,-3,12],
[3,'c','d',.3,-5,14]],
columns=['sample','id1','id2','x','y1','y2'])
print df1
# sample id1 id2 x y1 y2
#0 1 a b 0.1 -1 10
#1 2 a b 0.2 -3 12
#2 3 c d 0.3 -5 14
进入:
# sample id position x y
#0 1 a 1 0.1 -1
#1 1 b 2 0.1 10
#2 2 a 1 0.2 -3
#3 2 b 2 0.2 12
#4 3 c 1 0.3 -5
#5 3 d 2 0.3 14
注意x是复制的,y是和position对齐的。
直接 pd.melt()
创建混合变量和数据类型,这些变量和数据类型不容易选择性地转换回宽格式。
print pd.melt(df1, id_vars='sample')
# sample variable value
#0 1 id1 a
#1 2 id1 a
#2 3 id1 c
#3 1 id2 b
#4 2 id2 b
#5 3 id2 d
#6 1 x 0.1
#7 2 x 0.2
#8 3 x 0.3
#9 1 y1 -1
#10 2 y1 -3
#11 3 y1 -5
#12 1 y2 10
#13 2 y2 12
#14 3 y2 14
有什么建议吗?谢谢!
你可以试试这个:
# set columns that don't change as index
df1.set_index(['sample', 'x'], inplace=True)
# create multi-index columns based on the names pattern
df1.columns = pd.MultiIndex.from_arrays(df1.columns.str.extract(r"(\D+)(\d+)", expand=True).T.values)
# transform the multi-index data frames to long format with stack
df1.stack(level=1).rename_axis(('sample', 'x', 'position')).reset_index()
数据处理问题:如何从超宽的 DataFrame 中有选择地转换某些变量?
比如我想转:
df1 = pd.DataFrame(
[[1,'a','b',.1,-1,10],
[2,'a','b',.2,-3,12],
[3,'c','d',.3,-5,14]],
columns=['sample','id1','id2','x','y1','y2'])
print df1
# sample id1 id2 x y1 y2
#0 1 a b 0.1 -1 10
#1 2 a b 0.2 -3 12
#2 3 c d 0.3 -5 14
进入:
# sample id position x y
#0 1 a 1 0.1 -1
#1 1 b 2 0.1 10
#2 2 a 1 0.2 -3
#3 2 b 2 0.2 12
#4 3 c 1 0.3 -5
#5 3 d 2 0.3 14
注意x是复制的,y是和position对齐的。
直接 pd.melt()
创建混合变量和数据类型,这些变量和数据类型不容易选择性地转换回宽格式。
print pd.melt(df1, id_vars='sample')
# sample variable value
#0 1 id1 a
#1 2 id1 a
#2 3 id1 c
#3 1 id2 b
#4 2 id2 b
#5 3 id2 d
#6 1 x 0.1
#7 2 x 0.2
#8 3 x 0.3
#9 1 y1 -1
#10 2 y1 -3
#11 3 y1 -5
#12 1 y2 10
#13 2 y2 12
#14 3 y2 14
有什么建议吗?谢谢!
你可以试试这个:
# set columns that don't change as index
df1.set_index(['sample', 'x'], inplace=True)
# create multi-index columns based on the names pattern
df1.columns = pd.MultiIndex.from_arrays(df1.columns.str.extract(r"(\D+)(\d+)", expand=True).T.values)
# transform the multi-index data frames to long format with stack
df1.stack(level=1).rename_axis(('sample', 'x', 'position')).reset_index()