仅对列中的特定值进行透视
Pivot only certain values in a column
我有这样的数据框(key_ 的数量总是等于 value_ 的数量,但这个数字是事先不知道的):
firstid secondid key_1 key_2 key_3 ... key_n value_1 value_2 value_3 ... value_n
1 one A B C ... Z alpha beta gamma ... omega
我想将它们重塑成这种格式:
first_id second_id key value
1 one A alpha
1 one B beta
1 one C gamma
1 one ... ...
1 one Z omega
像这样使用 melt
...
value_vars = [x for x in df.columns if x.startswith('key_') or x.startswith('value_')]
df = pd.melt(df, id_vars=["firstid",
"secondid"],
value_vars=value_vars)
...我得到这个结果:
firstid secondid variable value
0 1 one key_1 A
1 1 one key_2 B
2 1 one key_3 C
3 1 one key_n Z
4 1 one value_1 alpha
5 1 one value_2 beta
6 1 one value_3 gamma
7 1 one value_n omega
它显然仍然是一个步骤,但我无法弄清楚熔化、枢轴、堆栈等丛林中的哪一步。欢迎任何解释或线索。
我认为你需要:
- 第一个
set_index
对于没有 _
的所有列
- 按
split
在列中创建 MultiIndex
- 由
stack
重塑
- 双重数据清理
reset_index
df = df.set_index(['firstid','secondid'])
df.columns = df.columns.str.split('_', expand=True)
df = df.stack().reset_index(level=2, drop=True).reset_index()
print (df)
firstid secondid key value
0 1 one A alpha
1 1 one B beta
2 1 one C gamma
3 1 one Z zeta
我有这样的数据框(key_ 的数量总是等于 value_ 的数量,但这个数字是事先不知道的):
firstid secondid key_1 key_2 key_3 ... key_n value_1 value_2 value_3 ... value_n
1 one A B C ... Z alpha beta gamma ... omega
我想将它们重塑成这种格式:
first_id second_id key value
1 one A alpha
1 one B beta
1 one C gamma
1 one ... ...
1 one Z omega
像这样使用 melt
...
value_vars = [x for x in df.columns if x.startswith('key_') or x.startswith('value_')]
df = pd.melt(df, id_vars=["firstid",
"secondid"],
value_vars=value_vars)
...我得到这个结果:
firstid secondid variable value
0 1 one key_1 A
1 1 one key_2 B
2 1 one key_3 C
3 1 one key_n Z
4 1 one value_1 alpha
5 1 one value_2 beta
6 1 one value_3 gamma
7 1 one value_n omega
它显然仍然是一个步骤,但我无法弄清楚熔化、枢轴、堆栈等丛林中的哪一步。欢迎任何解释或线索。
我认为你需要:
- 第一个
set_index
对于没有_
的所有列
- 按
split
在列中创建 - 由
stack
重塑
- 双重数据清理
reset_index
MultiIndex
df = df.set_index(['firstid','secondid'])
df.columns = df.columns.str.split('_', expand=True)
df = df.stack().reset_index(level=2, drop=True).reset_index()
print (df)
firstid secondid key value
0 1 one A alpha
1 1 one B beta
2 1 one C gamma
3 1 one Z zeta