首页 > 解决方案 > 从数据框创建面板数据

问题描述

我在这里找不到我的问题的解决方案,希望你能解决它。这是我当前的数据框:

| Index | Col_1_data | Col_2_data | Col_3_data | Col_1_new_data | Col_2_new_data | Col_3_new_data |
|   1   |     a      |     d      |     g      |     j          |     m          |     p          |
|   2   |     b      |     e      |     h      |     k          |     n          |     q          |
|   3   |     c      |     f      |     i      |     l          |     o          |     r          |

我们的想法是将它融化,使其看起来像这样:

| Index | data | new_data | id_col |
|   1   |    a |     j    | Col_1  |   
|   2   |    b |     k    | Col_1  |  
|   3   |    c |     l    | Col_1  |
|   1   |    d |     m    | Col_2  |
|   2   |    e |     n    | Col_2  |
|   3   |    f |     o    | Col_2  |
....etc....

所以让它成为一个面板,但没有任何 ID 列,而是每列都相同的部分字符串(例如 Col_1、Col_2 等)。有没有办法“pythonically”或者我需要循环和堆叠?

标签: pythondataframepanel

解决方案


这是一种方法,但也许有一种更有效的方法。

您可以做的是根据列是否为“新”,将数据集分成两部分,然后使用pd.meltwith pd.concat

# Create an index column (if not exists already)
df['index']=np.arange(len(df))+1

# melt both datasets and concat together
out = pd.concat([pd.melt(pd.concat([df.filter(like='new'),df[['index']]],axis=1),
                         id_vars='index',var_name=['id_col']).rename({'value':'data'},
                                                                     axis=1).drop(['id_col'],axis=1),
                 pd.melt(df[[i for i in df.columns if 'new' in i or 'index' in i]],
                         id_vars='index',var_name=['id_col']).rename({'value':'new_data'},
                                                                     axis=1)],
                axis=1)

# Remove the '_new_data' from the 'id_col'
out['id_col'] = out['id_col'].str.replace('_new_data','')

# Rearrange the columns to match your output
out = out[['index','data','new_data','id_col']]

印刷:

   index data new_data id_col
0      1    a        j  Col_1
1      2    b        k  Col_1
2      3    c        l  Col_1
3      1    d        m  Col_2
4      2    e        n  Col_2
5      3    f        o  Col_2
6      1    g        p  Col_3
7      2    h        q  Col_3
8      3    i        r  Col_3

最后两个步骤只需要精确地达到您想要的结果。


推荐阅读