如何在 pandas 中合并宽数据框和长数据框?
How to combine a wide and a long dataframe in pandas?
我有以下数据框
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
我很想听听有关如何实现这一目标的任何建议。
编辑:很多人正确地指出原始数据集的格式很整齐。这是正确的 - 它只是用作一个简单的例子。实际数据框不整齐开始。
所以你已经有了数据输入和熔化过程(老实说你不确定你为什么决定熔化它,因为原始数据看起来是整齐的格式):
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
使用map
:
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
当你 melt
时只需将 Hair_Width
添加为另一个 id_var
,之后无需执行任何操作。
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
除了其他问题,我不确定您为什么首先要重塑为 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
或者像
那样分两个阶段进行
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
我有以下数据框
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
我很想听听有关如何实现这一目标的任何建议。
编辑:很多人正确地指出原始数据集的格式很整齐。这是正确的 - 它只是用作一个简单的例子。实际数据框不整齐开始。
所以你已经有了数据输入和熔化过程(老实说你不确定你为什么决定熔化它,因为原始数据看起来是整齐的格式):
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
使用map
:
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
当你 melt
时只需将 Hair_Width
添加为另一个 id_var
,之后无需执行任何操作。
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
除了其他问题,我不确定您为什么首先要重塑为 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
或者像
那样分两个阶段进行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