如何为熊猫数据帧的每一行分配值?

时间:2019-03-29 11:35:46

标签: python pandas dataframe apply

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

我有两个数据框。在输入数据框中,我有品牌:

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')

请问有人可以如何处理这个问题吗?提前非常感谢!

3 个答案:

答案 0 :(得分:4)

您正在寻找两个数据帧中的cartesian product。在熊猫中解决此问题的一种方法是为两个数据帧创建一个通用且唯一的 key 并执行merge(任何操作,因为它们都有完全的重叠):

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

答案 1 :(得分:2)

使用itertools.product()的另一种方法,它给出输入可迭代项的笛卡尔乘积。

import itertools
df=(pd.DataFrame(list(itertools.product(brand_name.brand_name,object_raw.object_name))
             ,columns=['brand_name','object_name']))
df['category_id']=df['object_name'].map(object_raw.set_index('object_name')['category_id'])
print(df)

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

答案 2 :(得分:1)

这被称为笛卡尔积。在大熊猫中,这有点棘手,但是您可以这样做:

import pandas as pd

objects = pd.DataFrame(["T-shirt","Shorts","Dress"],columns = ['object'])
brands =  pd.DataFrame(["Nike","Lacoste","Adidas"],columns = ['brand'])

objects["key"] = 1
brands ["key"] = 1

objects.merge(brands,on='key').drop('key',axis=1)