繁体   English   中英

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

[英]Remove Columns And Create Unique Row For Each Removed Column Pandas Dataframe

这是我遇到的一个非常棘手的问题,它正在抨击我的 memory 管理,这是设置:

我有一个 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_1     1
   A       B       C      d_2     4
   A       B       C      d_3     0
   .
   .
   .
   A       B       C      d_2000  100

以下代码为我提供了一个2个DIM系列,可以返回到Z6A8064B5DF47945555555555553C47C55057DZ中,但是由于我需要与一些工作变量一起使用,因此在32GB上运行了32GB的RAM上,ZE206A54E ENTIMS SYPSER SHODY ZER SHODY eNTRESS ON ENTR SHOGTER ON EUNTER SHOGTER ON EUNTER SLYSS ONS SLYSS INTR SHODY ONS SOLDY oty of ENTINS SHOTER SLYS上很少,很快很少。 :

def convert_timeseries_to_rows(row):
    d_idx = 1
    rows_to_return = []
    for day_count in row[6:]: ### d columns start from 6
        new = list(row[:6]) ### keep first 6 columns
        day_string = "d_"+str(d_idx)
        new.append(day_string)
        new.append(day_count)
        rows_to_return.append(new)
        d_idx = d_idx + 1
    return rows_to_return ### return all rows generated


2_dim_series = df.apply(convert_timeseries_to_rows, axis=1)


data = []
columns = ['unique1', "unique2"..., 'date_index', 'units']
for each in 2_dim_series :
    for row in each:
        data.append(dict(zip(columns,row)))
data = pd.DataFrame(data)
data.to_csv('save_to_disk.csv')

任何专业人士都可以想到更好的方法来做到这一点(在python中)吗?

谢谢!

示例输入:

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

示例 Output:

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

Pandas对此有一个解决方案: 熔化

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

我像这样重新创建了 dataframe:

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')]

然后生成第二个dataframe:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM