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

时间:2019-08-08 18:03:15

标签: 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      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

我很想听听有关如何实现此目标的任何建议。

编辑:很多人正确地指出原始数据集是整齐的格式。没错-只是作为一个简单的例子。实际的数据帧不是很整洁。

4 个答案:

答案 0 :(得分:5)

在您Hair_Width时,只需将id_var添加为另一个melt,之后就无需执行任何操作。


df.melt(id_vars=['Name', 'Hair_Width'], value_vars=['Age', 'Height']) 

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

答案 1 :(得分:2)

除了其他问题,我不确定为什么首先要重塑,但是可以通过方法链接轻松实现。

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

或者分两个阶段进行

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

答案 2 :(得分:1)

因此,您已经有了数据输入和融合过程(诚实地不确定为什么您还是决定融合它,因为原始数据似乎是整齐的格式):

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)
new_df = pd.melt(df, id_vars=['Name'], value_vars=['Age', 'Height'])

我提供了上面使用的名称。进行合并并修饰:

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

答案 3 :(得分:1)

使用Providers.findAll({ attributes: [ ... ], include: [ .... ], where: { ... }, raw : true, // <---- HERE nest : true // <---- HERE }) .then(providerData => { console.log(providerData) }).catch(err => { console.log(err); res.status(404).send({ reason: err.message }) });

Private Sub Application_ItemSend(ByVal olItem As Object, Cancel As Boolean)
Dim response As Integer
response = MsgBox("WHOA - delay sending?", vbYesNo + vbQuestion)
If response = vbYes Then
olItem.DeferredDeliveryTime = DateAdd("n", 10, Now)
Else: MsgBoxResult = vbNo
olItem.DeferredDeliveryTime = DateAdd("n", 2, Now)
End If
End Sub

输出:

map