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
相同。