熊猫-在保留索引的同时将列拆分为行

时间:2019-11-15 16:50:48

标签: python pandas

我有以下简化的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:)

2 个答案:

答案 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_xvalue_y重命名为公用名value

df1 = df1.rename(columns={'value_x' : 'value'}) <br> df2 = df2.rename(columns={'value_y': 'value'})

现在将两个数据帧df1df2串联在一起,而忽略了索引值

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_aindex_b分组来对行进行排序

df3.sort_values(['index_a', 'index_b'])