Python 高效地将数据帧行转换为列名和值组合列表

Python 高效地将数据帧行转换为列名和值组合列表,python,pandas,performance,dataframe,vectorization,Python,Pandas,Performance,Dataframe,Vectorization,我正在将我的Pandas数据帧格式化为机器学习模型所需的格式 预处理步骤中最令人沮丧的任务之一是高效地将数据帧行转换为列名和值组合列表 我的数据框中的两行示例如下所示: index | userID | col1 | col2 | col3 ... col10000 0 123 0 1 0 1 1 456 1 1 0 0 所需格式是元组列表,其中第一个值是userID,第

我正在将我的Pandas数据帧格式化为机器学习模型所需的格式

预处理步骤中最令人沮丧的任务之一是高效地将数据帧行转换为列名和值组合列表

我的数据框中的两行示例如下所示:

index | userID | col1 | col2 | col3 ... col10000
0        123      0      1      0          1
1        456      1      1      0          0
所需格式是元组列表,其中第一个值是userID,第二个值是包含其余列名及其值组合的列表,例如:

[(123, ['col1:0', 'col2:1', 'col3:0',...., 'col10000:1'])
,(456, ['col1:1', 'col2:1', 'col3:0',...., 'col10000:0'])]
我已经尝试过并行化apply,但是apply方法仍然非常慢,并行化会导致内存问题。 尝试的应用方法是:

def add_features(row):
    return ((int(row.iloc[0]),(",".join(["%s:%s"%(x,y) for x,y in row[row.index[1:]].items()]).split(",")))) 
def apply_add_features(df):
    df['features_formatted'] = df.apply(add_features, axis=1)
    return df['features_formatted']
apply_add_features(df)

有人能帮上忙吗?

您可以对数据帧这样做,请注意,我首先将数据帧转换为python词汇,这样可以更有效地更改形状(如果内存问题得到解决,请告诉我): 示例数据帧

df = pd.DataFrame({'userID':np.arange(0,100,10),'a':np.arange(10),'b':np.arange(10)})

 userID a  b
0   0   0  0
1  10   1  1
2  20   2  2
3  30   3  3
4  40   4  4
5  50   5  5
6  60   6  6
7  70   7  7
8  80   8  8
9  90   9  9
获取结果的代码:

df = df.set_index('userID')
data =[(k,[f"{k2}:{v}" for k2,v in d.items()]) for k,d in df.to_dict('index').items()]
>>> data
[(0, ['a:0', 'b:0']),
 (10, ['a:1', 'b:1']),
 (20, ['a:2', 'b:2']),
 (30, ['a:3', 'b:3']),
 (40, ['a:4', 'b:4']),
 (50, ['a:5', 'b:5']),
 (60, ['a:6', 'b:6']),
 (70, ['a:7', 'b:7']),
 (80, ['a:8', 'b:8']),
 (90, ['a:9', 'b:9'])]

您可以对您的数据帧执行此操作,请注意,我首先将数据帧转换为python词汇,这样可以更有效地更改形状(如果内存问题得到解决,请告诉我): 示例数据帧

df = pd.DataFrame({'userID':np.arange(0,100,10),'a':np.arange(10),'b':np.arange(10)})

 userID a  b
0   0   0  0
1  10   1  1
2  20   2  2
3  30   3  3
4  40   4  4
5  50   5  5
6  60   6  6
7  70   7  7
8  80   8  8
9  90   9  9
获取结果的代码:

df = df.set_index('userID')
data =[(k,[f"{k2}:{v}" for k2,v in d.items()]) for k,d in df.to_dict('index').items()]
>>> data
[(0, ['a:0', 'b:0']),
 (10, ['a:1', 'b:1']),
 (20, ['a:2', 'b:2']),
 (30, ['a:3', 'b:3']),
 (40, ['a:4', 'b:4']),
 (50, ['a:5', 'b:5']),
 (60, ['a:6', 'b:6']),
 (70, ['a:7', 'b:7']),
 (80, ['a:8', 'b:8']),
 (90, ['a:9', 'b:9'])]

嘿,我试过你的密码了。问题是性能很慢(不到60k的用户需要5分钟以上的时间,而将有超过600k的用户),您能告诉我哪行代码最消耗?您确定数据不够大,无法查找或其他解决方案吗?有几排?有多少列?尝试计时或使用行配置文件Y,尝试您的代码。问题是性能很慢(不到60k的用户需要5分钟以上的时间,而将有超过600k的用户),您能告诉我哪行代码最消耗?您确定数据不够大,无法查找或其他解决方案吗?有几排?有多少列?尝试计时或使用测线探查器