Python 如何在熊猫中组合宽数据帧和长数据帧?

Python 如何在熊猫中组合宽数据帧和长数据帧?,python,python-3.x,pandas,dataframe,melt,Python,Python 3.x,Pandas,Dataframe,Melt,我有以下数据帧 data = {'Name':['Tom', 'nick', 'krish', 'jack'], 'Age':[20, 21, 19, 18], 'Height':[23, 43, 123, 12], 'Hair_Width':[21, 11, 23, 14]} df = pd.DataFrame(data) df Name Age Height Hair_Width 0 Tom 20 23 21 1 nick 21 43

我有以下数据帧

data = {'Name':['Tom', 'nick', 'krish', 'jack'], 'Age':[20, 21, 19, 18], 'Height':[23, 43, 123, 12], 'Hair_Width':[21, 11, 23, 14]} 
df = pd.DataFrame(data) 
df

    Name    Age Height  Hair_Width
0   Tom     20  23      21
1   nick    21  43      11
2   krish   19  123     23
3   jack    18  12      14
我在此数据帧上执行了如下熔化操作:

pd.melt(df, id_vars=['Name'], value_vars=['Age', 'Height'])
df
    Name    variable    value  
0   Tom     Age         20     
1   nick    Age         21     
2   krish   Age         19     
3   jack    Age         18     
4   Tom     Height      23     
5   nick    Height      43     
6   krish   Height      123    
7   jack    Height      12     
但是,我希望将新的数据帧与原始(宽)数据帧中的一个变量结合起来,以获得以下所需的输出:

    Name    variable    value  Hair_Width
0   Tom     Age         20     21
1   nick    Age         21     11
2   krish   Age         19     23
3   jack    Age         18     14
4   Tom     Height      23     21
5   nick    Height      43     11
6   krish   Height      123    23
7   jack    Height      12     14
我很想听到关于如何实现这一目标的任何建议


编辑:许多人正确地指出原始数据集的格式很整齐。这是正确的-这只是一个简单的例子。实际的数据帧开始时并不整齐。

因此您已经有了数据输入和融化过程(老实说,不确定您为什么决定融化它,因为原始数据的格式看起来很整齐):

我已经提供了我在上面使用的名称。进行合并,然后poof:

new_df.merge(df[['Name', 'Hair_Width']], on='Name', how='left')
Out[25]: 
    Name variable  value  Hair_Width
0    Tom      Age     20          21
1   nick      Age     21          11
2  krish      Age     19          23
3   jack      Age     18          14
4    Tom   Height     23          21
5   nick   Height     43          11
6  krish   Height    123          23
7   jack   Height     12          14
使用
映射

df_out = pd.melt(df, id_vars=['Name'], value_vars=['Age', 'Height'])
df_out['Hair_Width'] = df_out['Name'].map(df.set_index('Name')['Hair_Width'])
df_out
输出:

    Name variable  value  Hair_Width
0    Tom      Age     20          21
1   nick      Age     21          11
2  krish      Age     19          23
3   jack      Age     18          14
4    Tom   Height     23          21
5   nick   Height     43          11
6  krish   Height    123          23
7   jack   Height     12          14
    Name variable  value  Hair_Width
0    Tom      Age     20          21
1   nick      Age     21          11
2  krish      Age     19          23
3   jack      Age     18          14
4    Tom   Height     23          21
5   nick   Height     43          11
6  krish   Height    123          23
7   jack   Height     12          14
    Name variable  value  Hair_Width
0    Tom      Age     20          21
1   nick      Age     21          11
2  krish      Age     19          23
3   jack      Age     18          14
4    Tom   Height     23          21
5   nick   Height     43          11
6  krish   Height    123          23
7   jack   Height     12          14

只需在
熔化时添加
Hair\u Width
作为另一个
id\u var
,之后无需执行任何操作



除了其他问题之外,我不知道为什么您首先要将形状改为long,但您可以通过方法链接轻松实现这一点

newdf = (df
         .melt(id_vars='Name', value_vars=['Age', 'Height'])
         .merge(df[['Name', 'Hair_Width']], how='left', on='Name'))
输出:

    Name variable  value  Hair_Width
0    Tom      Age     20          21
1   nick      Age     21          11
2  krish      Age     19          23
3   jack      Age     18          14
4    Tom   Height     23          21
5   nick   Height     43          11
6  krish   Height    123          23
7   jack   Height     12          14
    Name variable  value  Hair_Width
0    Tom      Age     20          21
1   nick      Age     21          11
2  krish      Age     19          23
3   jack      Age     18          14
4    Tom   Height     23          21
5   nick   Height     43          11
6  krish   Height    123          23
7   jack   Height     12          14
    Name variable  value  Hair_Width
0    Tom      Age     20          21
1   nick      Age     21          11
2  krish      Age     19          23
3   jack      Age     18          14
4    Tom   Height     23          21
5   nick   Height     43          11
6  krish   Height    123          23
7   jack   Height     12          14
或者分两个阶段进行,如

melted = df.melt(id_vars='Name', value_vars=['Age', 'Height'])
newdf = melted.merge(df[['Name', 'Hair_Width']], how='left', on='Name')
输出:

    Name variable  value  Hair_Width
0    Tom      Age     20          21
1   nick      Age     21          11
2  krish      Age     19          23
3   jack      Age     18          14
4    Tom   Height     23          21
5   nick   Height     43          11
6  krish   Height    123          23
7   jack   Height     12          14
    Name variable  value  Hair_Width
0    Tom      Age     20          21
1   nick      Age     21          11
2  krish      Age     19          23
3   jack      Age     18          14
4    Tom   Height     23          21
5   nick   Height     43          11
6  krish   Height    123          23
7   jack   Height     12          14
    Name variable  value  Hair_Width
0    Tom      Age     20          21
1   nick      Age     21          11
2  krish      Age     19          23
3   jack      Age     18          14
4    Tom   Height     23          21
5   nick   Height     43          11
6  krish   Height    123          23
7   jack   Height     12          14

原始数据帧不宽。看起来它的格式很整齐,不应该改变。