【问题标题】:Transforming DataFrame Rows Into Lists of Column Name and Value Combinations Efficiently有效地将 DataFrame 行转换为列名和值组合的列表
【发布时间】:2021-04-02 01:09:22
【问题描述】:

我正在将我的 Pandas DataFrame 格式化为机器学习模型所需的格式。

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

我的 DataFrame 中的两行示例如下所示:

index | userID | col1 | col2 | col3 ... col10000
0        123      0      1      0          1
1        456      1      1      0          0

所需格式是元组列表,其中第一个值是用户 ID,第二个值是包含其余列名及其值的组合的列表,例如:

[(123, ['col1:0', 'col2:1', 'col3:0',...., 'col10000:1'])
,(456, ['col1:1', 'col2:1', 'col3:0',...., 'col10000:0'])]

我已经尝试过并行化 apply 但是 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 pandas performance dataframe vectorization


    【解决方案1】:

    您可以对您的数据框执行此操作,请注意,我首先将数据框转换为 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 的用户)
    • 你能说出哪些代码行是最消耗的吗?您确定数据不够大,无法寻找其他解决方案吗?多少行?有多少列?尝试计时或使用线分析器
    猜你喜欢
    • 2019-05-17
    • 2022-09-24
    • 2019-08-06
    • 2023-04-07
    • 2019-07-22
    • 2019-08-06
    • 2019-05-23
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多