我在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
?
答案 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)
您可以将rename
和na
的列名DataFrame.melt
与https://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