This question already has answers here:
Performant cartesian product (CROSS JOIN) with pandas

(3个答案)


2年前关闭。




我一直在尝试为数据框的每一行分配一个值,但我一直没有这样做(我是 Pandas 新手),所以如果有人可以帮忙,我将非常感激!

我有两个数据框。在输入数据框中,我有以下品牌:
brand_raw.head()

brand_name
0   Nike
1   Lacoste
2   Adidas

然后,在输出数据集上,我有一些对象:
object_raw.head()

category_id object_name
0   24  T-shirt
1   45  Shorts
2   32  Dress

我需要的是一个包含所有对象和所有品牌的数据框:
to_raw.head()

category_id object_name brand_name
0   24  T-shirt     Nike
1   45  Shorts      Nike
2   32  Dress       Nike
3   24  T-shirt     Lacoste
4   45  Shorts      Lacoste
5   32  Dress       Lacoste
6   24  T-shirt     Adidas
7   45  Shorts      Adidas
8   32  Dress       Adidas


我一直在尝试使用apply函数,对行进行迭代,但是最终覆盖了值,所以我写了最后一个品牌:
0   24  T-shirt     Nike
1   45  Shorts      Nike
2   32  Dress       Nike

这是我的代码:
def insert_value_in_every_row(input_df, output_df, column_name):
    for row in input_df.values:
        row = row[0].rstrip()

        output_df[column_name] = output_df[column_name].apply(lambda x: row)
    return output_df


insert_value_in_every_row(brand_raw, to_raw, 'brand_name')

有人可以给我提示如何处理吗?在此先多谢!

最佳答案

您正在寻找两个数据框的cartesian product。在 Pandas 中解决此问题的一种方法是为两个数据帧创建一个公共(public)且唯一的 key ,并执行 merge (任何 key ,因为存在完全重叠):

df.assign(key=0).merge(object_raw.assign(key=0), on='key').drop(['key'], axis=1)

   brand_name  category_id object_name
0       Nike           24     T-shirt
1       Nike           45      Shorts
2       Nike           32       Dress
3    Lacoste           24     T-shirt
4    Lacoste           45      Shorts
5    Lacoste           32       Dress
6     Adidas           24     T-shirt
7     Adidas           45      Shorts
8     Adidas           32       Dress

关于python - 如何为 Pandas 数据框的每一行分配值? [复制],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55416610/

10-12 16:52
查看更多