Python 删除列并为每个删除的列创建唯一的行

Python 删除列并为每个删除的列创建唯一的行,python,pandas,dataframe,Python,Pandas,Dataframe,这是我遇到的一个非常棘手的问题,它严重影响了我的内存管理,以下是设置: 我有一个具有以下列设置的数据框: Unique1 Unique2 Unique3 d_1 d_2 d_3..... d_2000 A B C 1 4 0 100 我想删除d_1…d_2000列,而是为每个条目创建一个唯一的行: Unique1 Unique2 Unique3 d_index d_value A B C d_

这是我遇到的一个非常棘手的问题,它严重影响了我的内存管理,以下是设置:

我有一个具有以下列设置的数据框:

Unique1 Unique2 Unique3 d_1 d_2 d_3..... d_2000
   A       B      C      1   4   0         100
我想删除d_1…d_2000列,而是为每个条目创建一个唯一的行:

Unique1 Unique2 Unique3 d_index d_value
   A       B       C      d_1     1
   A       B       C      d_2     4
   A       B       C      d_3     0
   .
   .
   .
   A       B       C      d_2000  100
下面的代码为我提供了一个2-dim系列,可以将其压缩到数据帧中,但由于我需要使用一些工作变量,因此它在linux上很快就耗尽了32gb的ram(在windows环境下工作,但速度非常慢):

有哪位专业人士能想出更好的方法(用python)来实现这一点

谢谢

输入示例:

Unique1 Unique2 Unique3 d_1 d_2 d_3
   A       B      C      1   4   0 
   D       E      F      5   9   12 
示例输出:

Unique1 Unique2 Unique3 d_index d_value
   A       B       C      d_1     1
   A       B       C      d_2     4
   A       B       C      d_3     0
   D       E       F      d_1     5
   D       E       F      d_2     9
   D       E       F      d_3     12


我重新创建了数据帧,如下所示:

import pandas as pd
n = 2000
df = pd.DataFrame(columns=['Unique' + str(i) for i in range(1,4)] 
             + ['d_' + str(i) for i in range(n)], 
            data= [['A','B','C']  + np.random.randint(0,100,n).astype(str).tolist()],
                  index = [0])
然后确定您正在使用的列:

d_cols = df.columns[df.columns.str.contains('d_')]
u_cols = df.columns[df.columns.str.contains('Unique')]
然后生成第二个数据帧:

df2 = pd.DataFrame({'d_index':d_cols, 
                    'd_value': df[d_cols].values.flatten()})
for col in u_cols:
    df2[col] = df[col][0]

熊猫有一个解决方案:


请分享几行,可能是5行,代表你的数据。任何解决方案都可以扩展到更大的datasetExample!谢谢你!干杯
df2 = pd.DataFrame({'d_index':d_cols, 
                    'd_value': df[d_cols].values.flatten()})
for col in u_cols:
    df2[col] = df[col][0]
df.melt(id_vars=['Unique1','Unique2','Unique3'],
        var_name='d_index',
        value_name='d_value')
 .sort_values('Unique1', ignore_index=True)


  Unique1   Unique2 Unique3 d_index d_value
0      A       B    C        d_1    1
1      A       B    C        d_2    4
2      A       B    C        d_3    0
3      D       E    F        d_1    5
4      D       E    F        d_2    9
5      D       E    F        d_3    12