首页 > 解决方案 > 将标签列添加到 DataFrame

问题描述

例如,我有两个 DataFrame

df1:

0    1    2    3
a    1    2    3    4
b   10   20   30   40
c  100  200  300  400
------------------

df2:

   0
0  x
1  y
2  z

现在我想将两者结合起来:

df_new:

   value label
0      1     x
1      2     x
2      3     x
3      4     x
0     10     y
1     20     y
2     30     y
3     40     y
0    100     z
1    200     z
2    300     z
3    400     z

我写了一个非常尴尬的代码,例如:

df_new=pd.DataFrame()

for i,j in zip(df1.index, df2.index):
    x=df1.loc[i]
    y=df2.loc[j]
    

    label=np.full(x.shape[0],y)
    
    df=pd.DataFrame({'value':x,'label':label})
    df_new=pd.concat([df_new,df],axis=0)
    
print(df_new)

但我可以想象有一个像 pd.melt 这样的 pandas 函数或者可以在更大范围内做得更好的东西。

标签: pythonpandasdataframepandas-melt

解决方案


如果两个 DataFrame 的长度相同,则可以df1按列0在中创建索引并通过df2重塑DataFrame.stack,最后需要一些数据处理:

df = (df1.set_index(df2[0])
         .stack()
         .reset_index(level=1, drop=True)
         .rename_axis('lab')
         .reset_index(name='val')[['val','lab']])


print (df)
    val lab
0     1   x
1     2   x
2     3   x
3     4   x
4    10   y
5    20   y
6    30   y
7    40   y
8   100   z
9   200   z
10  300   z
11  400   z

解决方案,DataFrame.melt并通过以下方式将第二个附加df到第一个DataFrame.join

df = (df1.reset_index(drop=True)
         .join(df2.add_prefix('label'))
         .melt(['label0', 'label1'], ignore_index=False)
         .sort_index(ignore_index=True)
         .drop('variable', axis=1)[['value','label0','label1']]
         )
print (df)
    value label0 label1
0       1      x     xx
1       2      x     xx
2       3      x     xx
3       4      x     xx
4      10      y     yy
5      20      y     yy
6      30      y     yy
7      40      y     yy
8     100      z     zz
9     200      z     zz
10    300      z     zz
11    400      z     zz

推荐阅读