【问题标题】:Convert selected dataframe columns to vector representation (including duplicate values)将选定的数据框列转换为矢量表示(包括重复值)
【发布时间】:2020-10-31 08:24:39
【问题描述】:

我有以下数据框 (product.csv),我想将其转换为矢量表示:

product_id,value
111,3000
121,2500
131,3500
141,1000
111,3300
151,2000
161,2300
171,1300
181,1500
191,4500
121,6000
121,1100

我的预期输出应该包括所有行,包括重复的 product_ids,并且是一个向量形式,如下所示:

[111:3000; 121:2500; 131:3500; 141:1000; 111:3300; 151:2000; 161:2300; 171:1300; 181:1500; 191:4500; 121:6000; 121:1100]

这是我迄今为止尝试过的:

import pandas as pd

df = pd.read_csv('product.csv') #, index_col=0, sep=','

my_dict_indx = df.set_index('product_id')['value'].to_dict()
print(my_dict_indx)

my_dict_zip = dict(zip(df.product_id, df.value))
print(my_dict_zip)

my_dict_groupby = df.groupby(level=0).apply(lambda x: x.to_dict('r')).to_dict()
print(my_dict_groupby)

但是,my_dict_indx = df.set_index('product_id')['value'].to_dict()my_dict_zip = dict(zip(df.product_id, df.value)) 都给了我以下输出,但排除了重复的 product_ids 111 和 121,不返回正确的顺序(例如,输出以 161:2300 而不是 111:3000 开头):

{161: 2300, 131: 3500, 171: 1300, 141: 1000, 111: 3300, 181: 1500, 151:2000、121:1100、191:4500}

另一方面,my_dict_groupby = df.groupby(level=0).apply(lambda x: x.to_dict('r')).to_dict() 在下面给出了正确的记录数和正确的顺序,但包括不必要的列索引、列名,并且没有向量表示。

{0: [{'product_id': 111, 'value': 3000}], 1: [{'product_id': 121, '值':2500}],2:[{'product_id':131,'值':3500}],3: [{'product_id': 141, 'value': 1000}], 4: [{'product_id': 111, 'value': 3300}],5:[{'product_id':151,'value':2000}],6:[{'product_id': 161,'值':2300}],7:[{'product_id':171,'值':1300}],8: [{'product_id': 181, 'value': 1500}], 9: [{'product_id': 191, 'value': 4500}], 10: [{'product_id': 121, 'value': 6000}], 11: [{'product_id': 121,'值':1100}]}

如何增强我的解决方案,以 [] 向量形式而不是 {} 字典形式实现我的预期输出。提前致谢。

【问题讨论】:

    标签: python pandas dataframe dictionary vector


    【解决方案1】:

    我会创建一个字符串数组,因为这是支持您想要的输出格式的唯一方法。然后你可以简单地使用.values 从熊猫系列中获取列/数组

    df['output_col'] = (df['product_id'].astype(str) + ':' + df['value'].astype(str)).values
    

    输出:

    array(['111:3000', '121:2500', '131:3500', '141:1000', '111:3300',
           '151:2000', '161:2300', '171:1300', '181:1500', '191:4500',
           '121:6000', '121:1100'], dtype=object)
    

    如果您希望将其作为列表而不是数组,只需在 .values 方法后添加 .tolist()。最后,请记住,在 Python 中,, 用于分隔数组/列表中的元素,而不是 ;

    【讨论】:

    • 添加到上面的答案,[k + ":" + v for k, v in df.astype(str).values]
    • 如果这些是唯一的列,那是不错的选择!
    • 非常感谢。您的解决方案很有帮助。
    猜你喜欢
    • 2021-05-05
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2021-06-25
    相关资源
    最近更新 更多