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

9
我需要找到使用现有 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

And need to have this result :

    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的函数:

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
你也可以使用 df.stack().sort_index(level=1) - Bharath M Shetty
@Dark 感谢您的评论。我在执行之前使用了.stack(还有一些列重命名)来减少执行时间。 - JC Guidicelli
1个回答

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

2
谢谢您的快速和清晰的回答。我将执行时间缩短了三倍。 - JC Guidicelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接