我有以下简化的DataFrame
:
import pandas as pd
pd.DataFrame([{'index_a':'a1', 'index_b':'b1', 'value_x':'x1', 'value_y':'y1'},
{'index_a':'a2', 'index_b':'b2', 'value_x':'x2', 'value_y':'y2'},
{'index_a':'a3', 'index_b':'b3', 'value_x':'x3', 'value_y':'y3'}])
它包含两个索引和两个值列。对于下游用途,没有两个值列(它们来自同一分布)没有意义。因此,我想“分解”这些列并列出一个大列表。这应该是结果:
pd.DataFrame([{'index_a':'a1', 'index_b':'b1', 'value':'x1'},
{'index_a':'a1', 'index_b':'b1', 'value':'x1'},
{'index_a':'a2', 'index_b':'b2', 'value':'x2'},
{'index_a':'a2', 'index_b':'b2', 'value':'y2'},
{'index_a':'a3', 'index_b':'b3', 'value':'x3'},
{'index_a':'a3', 'index_b':'b3', 'value':'y3'}])
我尝试通过.value
和.ravel()
隔离值,但没有一个产生期望的结果。
先谢谢了。 BBQuercus:)
答案 0 :(得分:1)
使用str.contains()
作为列名可以查找索引列,并将其作为id_vars
传递到df.melt()
下:
final=df.melt(df.columns[df.columns.str.contains('index')]).drop('variable',1)
index_a index_b value
0 a1 b1 x1
1 a2 b2 x2
2 a3 b3 x3
3 a1 b1 y1
4 a2 b2 y2
5 a3 b3 y3
答案 1 :(得分:1)
如果运行下面的代码
import pandas as pd
df = pd.DataFrame([{'index_a':'a1', 'index_b':'b1', 'value_x':'x1', 'value_y':'y1'},
{'index_a':'a2', 'index_b':'b2', 'value_x':'x2', 'value_y':'y2'},
{'index_a':'a3', 'index_b':'b3', 'value_x':'x3', 'value_y':'y3'}])
结果将是
index_a index_b value_x value_y
0 a1 b1 x1 y1
1 a2 b2 x2 y2
2 a3 b3 x3 y3
因此,您可以在这里选择['index_a', 'index_b', 'value_x']
列
df1 = df[['index_a', 'index_b', 'value_x']]
index_a index_b value_x
0 a1 b1 x1
1 a2 b2 x2
2 a3 b3 x3
类似地选择列['index_a', 'index_b', 'value_y']
df2 = df[['index_a', 'index_b', 'value_y']]
index_a index_b value_y
0 a1 b1 y1
1 a2 b2 y2
2 a3 b3 y3
将列value_x
和value_y
重命名为公用名value
df1 = df1.rename(columns={'value_x' : 'value'}) <br>
df2 = df2.rename(columns={'value_y': 'value'})
现在将两个数据帧df1
和df2
串联在一起,而忽略了索引值
df3 = pd.concat([df1, df2], ignore_index=True)
index_a index_b value
0 a1 b1 x1
1 a2 b2 x2
2 a3 b3 x3
3 a1 b1 y1
4 a2 b2 y2
5 a3 b3 y3
通过将列index_a
和index_b
分组来对行进行排序
df3.sort_values(['index_a', 'index_b'])