通过加倍和串联来“平化”熊猫数据框?

时间:2020-03-20 12:02:13

标签: python pandas

我在datframe中有以下df pandas

na   nb   a    b
 1    2  12   a2
 1    5   1   c3
 2    5   5   a3

现在,我需要将df“展平”到一列,并添加一个“标记” m,告诉我这是哪一部分,所以

 d   a   b   m
 1  12  a2   I
 2  12  a2   I
 1   1  c3   I
 5   1  c3   O
 2   5  a3   O
 5   5  a3   O

我尝试了以下操作:

aa = df[["na","a","b"]]
ab = df[["nb","a","b"]]
aa["m"]="I" 
ab["m"]="O" 
aa.colums=["d","a","b"]
ab.colums=["d","a","b"]

然后

a = pd.concat([aa, ab])

但是我从“从DataFrame切片”(分配)中得到了很多警告,并且通过命名列来“熊猫不允许通过新的属性名称创建列”,尽管我以为我在重命名,而不是创建新的。

无论如何,我的问题是:如何以最pythonic / pandasonic的方式“弄平” df

2 个答案:

答案 0 :(得分:1)

在您的情况下,它只是melt

(df.melt(['a','b'], value_name='d')
   .assign(m=lambda x: np.where(x['variable'].eq('na'), 'I','O'))
   .drop('variable', axis=1)
)

输出:

    a   b  d  m
0  12  a2  1  I
1   1  c3  1  I
2   5  a3  2  I
3  12  a2  2  O
4   1  c3  5  O
5   5  a3  5  O

答案 1 :(得分:1)

您可以将renamena的列名DataFrame.melthttps://www.lfd.uci.edu/~gohlke/pythonlibs/一起使用:

nb

必要时最后更改列的顺序:

df1 = df.rename(columns={'na':'I', 'nb':'O'}).melt(['a','b'], value_name='d', var_name='m')

print (df1)
    a   b  m  d
0  12  a2  I  1
1   1  c3  I  1
2   5  a3  I  2
3  12  a2  O  2
4   1  c3  O  5
5   5  a3  O  5

您的解决方案应该更改,但是我首先觉得是pythonic:

df1 = df1[['d','a','b','m']]
print (df1)
   d   a   b  m
0  1  12  a2  I
1  1   1  c3  I
2  2   5  a3  I
3  2  12  a2  O
4  5   1  c3  O
5  5   5  a3  O