我一直在尝试为数据帧的每一行分配一个值,但我却一直没有这样做(我是熊猫新手),所以如果有人可以帮助我,我将非常感激!
我有两个数据框。在输入数据框中,我有品牌:
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')
请问有人可以如何处理这个问题吗?提前非常感谢!
答案 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)