Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;“扁平化”;通过加倍和连接来创建数据帧?_Python_Pandas - Fatal编程技术网

Python &引用;“扁平化”;通过加倍和连接来创建数据帧?

Python &引用;“扁平化”;通过加倍和连接来创建数据帧?,python,pandas,Python,Pandas,我有以下datframedf在pandas中: na nb a b 1 2 12 a2 1 5 1 c3 2 5 5 a3 现在,我需要将df展平到一列,并添加一个“marker”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 我尝试了以下方法

我有以下
datframe
df
pandas
中:

na   nb   a    b
 1    2  12   a2
 1    5   1   c3
 2    5   5   a3
现在,我需要将
df
展平到一列,并添加一个“marker”
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])
但是我从“数据帧切片”(分配)中得到了很多警告,通过命名列,“熊猫不允许通过新属性名创建列”,尽管我认为我是在重命名,而不是创建新的列


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

在你的情况下,它只是
融化

(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

在您的情况下,它只是
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

您可以使用
rename
列名称
na
nb

最后一列(如有必要)的变更顺序:

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
您的解决方案应该更改,但我觉得第一个更像python:

aa = df[["na","a","b"]].rename(columns={'na':'d'}).assign(m='I')
ab = df[["nb","a","b"]].rename(columns={'nb':'d'}).assign(m='O')
a = pd.concat([aa, ab], ignore_index=True)

print (a)
   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

您可以使用
rename
列名称
na
nb

最后一列(如有必要)的变更顺序:

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
您的解决方案应该更改,但我觉得第一个更像python:

aa = df[["na","a","b"]].rename(columns={'na':'d'}).assign(m='I')
ab = df[["nb","a","b"]].rename(columns={'nb':'d'}).assign(m='O')
a = pd.concat([aa, ab], ignore_index=True)

print (a)
   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
aa=df[..。copy()
,与
ab
相同
aa=df[..。copy()
,与
ab
相同。