将Pandas DataFrame列添加到行的最佳方法

时间:2018-06-20 16:22:08

标签: python pandas dataframe reshape

我必须找到使用现有DataFrame创建新Dataframe的最佳方法。

请查看此链接以获取完整的代码:jdoodle.com/a/xKP

我有这种DataFrame:

df = pd.DataFrame({'length': [112, 214, 52,88], 'views': [10000, 50000, 25000,5000], 'click': [55, 64, 85,9]},
     index = ['id1', 'id2', 'id3','id4'])

     click  length  views
id1     55     112  10000
id2     64     214  50000
id3     85      52  25000
id4      9      88   5000

并且需要得到这个结果:

    type_stat   stat
id1     click     55
id2     click     64
id3     click     85
id4     click      9
id1    length    112
id2    length    214
id3    length     52
id4    length     88
id1     views  10000
id2     views  50000
id3     views  25000
id4     views   5000

当前,我创建一个函数,该函数返回具有一个stat的DataFrame:

def df_by_stat(current_df,stat):
    current_df['type_stat'] = stat
    current_df['stat'] = current_df[stat].astype(int)

    return current_df[['type_stat','stat']]

使用如下函数创建.append后:

def final():
    return df_by_stat(df,'click').append(
    df_by_stat(df,'length')).append(
    df_by_stat(df,'views'))

print(final())

这种方法有效,但其复杂性取决于行和列的基数,太昂贵了。 这就是为什么我需要您的帮助才能找到最佳方法。

1 个答案:

答案 0 :(得分:3)

将索引提升到一系列后使用pandas.melt

res = pd.melt(df.assign(index=df.index), id_vars='index',
              value_name='stat', var_name='type_stat')\
        .set_index('index')

print(res)

      type_stat   stat
index                 
id1       click     55
id2       click     64
id3       click     85
id4       click      9
id1      length    112
id2      length    214
id3      length     52
id4      length     88
id1       views  10000
id2       views  50000
id3       views  25000
id4       views   5000