Python 抹去数据帧

Python 抹去数据帧,python,dataframe,Python,Dataframe,假设我有一个简单的数据框,如下所示: import pandas as pd data = [['3m',10, 12],['1y',12, 8.5],['2y',13, 4.6]] df = pd.DataFrame(data,columns=['Term', '3m','1y']) 将其转换为以下内容的最简单方法是什么: data = [['3m','3m', 10],['3m','1y', 12],['1y','3m', 12], ['1y','1y', 8.5], ['2y','3m'

假设我有一个简单的数据框,如下所示:

import pandas as pd
data = [['3m',10, 12],['1y',12, 8.5],['2y',13, 4.6]]
df = pd.DataFrame(data,columns=['Term', '3m','1y'])
将其转换为以下内容的最简单方法是什么:

data = [['3m','3m', 10],['3m','1y', 12],['1y','3m', 12], ['1y','1y', 8.5], ['2y','3m', 13], ['2y','1y', 4.6]]
df = pd.DataFrame(data,columns=['Term', 'Term','metric'])
我需要为具有更多列的数据帧执行此操作,因此我正在寻找一种简单的方法来实现此目的


谢谢

编辑:无内存密集型lambda/apply的单行解决方案:

pd.DataFrame(df1.set_index('Term').unstack().swaplevel()).reset_index()


    Term    level_1 0
0   3m      3m      10.0
1   1y      3m      12.0
2   2y      3m      13.0
3   3m      1y      12.0
4   1y      1y      8.5
5   2y      1y      4.6
这是一个多步骤解决方案,使用itertools.product获得现有索引和列值的组合,使用df.applylambda在原始df中查找值。我猜有更有效的方法:

import pandas as pd
from itertools import product
data = [['3m',10, 12],['1y',12, 8.5],['2y',13, 4.6]]
df1 = pd.DataFrame(data,columns=['Term', '3m','1y'])


   Term 3m  1y
0   3m  10  12.0
1   1y  12  8.5
2   2y  13  4.6

df3=pd.DataFrame(list(product(df1['Term'].values,df1.columns[1:])), columns=['term1','term2'])

    term1   term2
0   3m      3m
1   3m      1y
2   1y      3m
3   1y      1y
4   2y      3m
5   2y      1y

df3['metric']=df3.apply(lambda x:df1.set_index('Term').loc[x[0],x[1]], axis=1)

    term1   term2   metric
0   3m      3m      10.0
1   3m      1y      12.0
2   1y      3m      12.0
3   1y      1y      8.5
4   2y      3m      13.0
5   2y      1y      4.6

使用更简单的解决方案进行编辑