这是我遇到的一个非常棘手的问题,它猛烈地影响了我的内存管理,这是设置:
我有一个具有以下列设置的数据框:
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个昏暗的序列,可以将其压缩回一个数据帧,但是由于我需要使用一些工作变量,因此它在Linux上很快用完了32g的ram(可在Windows env上运行,但非常慢):
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
示例输出:
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
答案 0 :(得分:1)
熊猫对此有一个解决方案:melt
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
答案 1 :(得分:0)
我重新创建了这样的数据框:
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]