Pandas melt 以复制值并插入新列
Pandas melt to copy values and insert new column
我有两个数据框,如下所示
test_id,status,revenue,cnt_days,age
1,passed,234.54,3,21
2,passed,543.21,5,29
11,failed,21.3,4,35
15,failed,2098.21,6,57
51,passed,232,21,80
75,failed,123.87,32,43
df1 = pd.read_clipboard(sep=',')
test_id,var_name,score,sign
1,revenue,10,pos
1,cnt_days,5,neg
1,age,15,pos
2,revenue,11,pos
2,cnt_days,3,neg
2,age,25,pos
df2 = pd.read_clipboard(sep=',')
我想做以下事情
a) 从 df1 中取出变量 revenue
、cnt_days
、age
的值,并将其存储在 df2 中的新列 var_value
下。我们只复制这 3 个变量,因为它们存在于 df2[var_name]
下
例如:我们将 df1 列名称作为值存储在 var_name
下的 df2 中。
现在,我想为每个匹配 test_id
和相应的 column name
.
带来它们的值并将其存储在 var_value
下
我正在尝试类似下面的操作
out_df = df1.merge(df2,on='test_ids').melt(var_name='var_name')
out_df.drop_duplicates()
但这会导致输出不正确。
我希望我的输出如下所示
因为在输出中不是列 status
通过 drop
强制删除它,然后使用 DataFrame.melt
and add to df2
by left join in DataFrame.merge
:
out_df = df2.merge(df1.drop('status',1)
.melt('test_id', var_name='var_name', value_name='var_value'),
how='left')
print (out_df)
test_id var_name score sign var_value
0 1 revenue 10 pos 234.54
1 1 cnt_days 5 neg 3.00
2 1 age 15 pos 21.00
3 2 revenue 11 pos 543.21
4 2 cnt_days 3 neg 5.00
5 2 age 25 pos 29.00
如果列的顺序很重要:
out_df.insert(2, 'var_value', out_df.pop('var_value'))
print (out_df)
test_id var_name var_value score sign
0 1 revenue 234.54 10 pos
1 1 cnt_days 3.00 5 neg
2 1 age 21.00 15 pos
3 2 revenue 543.21 11 pos
4 2 cnt_days 5.00 3 neg
5 2 age 29.00 25 pos
df2.merge(df1.melt(id_vars=['test_id', 'status'],
var_name='var_name', value_name='var_value'),
on=['test_id', 'var_name'], how='left'
)
输出:
test_id var_name score sign status var_value
0 1 revenue 10 pos passed 234.54
1 1 cnt_days 5 neg passed 3.00
2 1 age 15 pos passed 21.00
3 2 revenue 11 pos passed 543.21
4 2 cnt_days 3 neg passed 5.00
5 2 age 25 pos passed 29.00
我有两个数据框,如下所示
test_id,status,revenue,cnt_days,age
1,passed,234.54,3,21
2,passed,543.21,5,29
11,failed,21.3,4,35
15,failed,2098.21,6,57
51,passed,232,21,80
75,failed,123.87,32,43
df1 = pd.read_clipboard(sep=',')
test_id,var_name,score,sign
1,revenue,10,pos
1,cnt_days,5,neg
1,age,15,pos
2,revenue,11,pos
2,cnt_days,3,neg
2,age,25,pos
df2 = pd.read_clipboard(sep=',')
我想做以下事情
a) 从 df1 中取出变量 revenue
、cnt_days
、age
的值,并将其存储在 df2 中的新列 var_value
下。我们只复制这 3 个变量,因为它们存在于 df2[var_name]
例如:我们将 df1 列名称作为值存储在 var_name
下的 df2 中。
现在,我想为每个匹配 test_id
和相应的 column name
.
var_value
下
我正在尝试类似下面的操作
out_df = df1.merge(df2,on='test_ids').melt(var_name='var_name')
out_df.drop_duplicates()
但这会导致输出不正确。
我希望我的输出如下所示
因为在输出中不是列 status
通过 drop
强制删除它,然后使用 DataFrame.melt
and add to df2
by left join in DataFrame.merge
:
out_df = df2.merge(df1.drop('status',1)
.melt('test_id', var_name='var_name', value_name='var_value'),
how='left')
print (out_df)
test_id var_name score sign var_value
0 1 revenue 10 pos 234.54
1 1 cnt_days 5 neg 3.00
2 1 age 15 pos 21.00
3 2 revenue 11 pos 543.21
4 2 cnt_days 3 neg 5.00
5 2 age 25 pos 29.00
如果列的顺序很重要:
out_df.insert(2, 'var_value', out_df.pop('var_value'))
print (out_df)
test_id var_name var_value score sign
0 1 revenue 234.54 10 pos
1 1 cnt_days 3.00 5 neg
2 1 age 21.00 15 pos
3 2 revenue 543.21 11 pos
4 2 cnt_days 5.00 3 neg
5 2 age 29.00 25 pos
df2.merge(df1.melt(id_vars=['test_id', 'status'],
var_name='var_name', value_name='var_value'),
on=['test_id', 'var_name'], how='left'
)
输出:
test_id var_name score sign status var_value
0 1 revenue 10 pos passed 234.54
1 1 cnt_days 5 neg passed 3.00
2 1 age 15 pos passed 21.00
3 2 revenue 11 pos passed 543.21
4 2 cnt_days 3 neg passed 5.00
5 2 age 25 pos passed 29.00