首页 > 解决方案 > 将 pandas DataFrame 列添加到行的最佳方法

问题描述

我必须找到使用现有 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

目前,我创建了一个返回 DataFrame 并带有一个 stat 的函数:

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())

这种方式是可行的,但它的复杂性取决于行和列的基数太贵了。这就是为什么我需要你的帮助来找到最好的方法。

标签: pythonpandasdataframereshape

解决方案


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

推荐阅读