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

JC *_*lli 9 python reshape dataframe pandas

我必须找到使用现有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
Run Code Online (Sandbox Code Playgroud)

并且需要有这样的结果:

    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
Run Code Online (Sandbox Code Playgroud)

目前,我创建了一个返回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']]
Run Code Online (Sandbox Code Playgroud)

在我.append使用这样的函数后:

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

print(final())
Run Code Online (Sandbox Code Playgroud)

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

jpp*_*jpp 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
Run Code Online (Sandbox Code Playgroud)

  • 感谢您快速而清晰的答复。我减少了3次执行。 (2认同)