我有两个Dataframe存储有关商店中采购的产品的数据。 df1
存储有关商店名称,产品ID,产品名称和购买日期的数据。 df2
存储有关产品ID,产品名称和类型的数据。我正在尝试使用df2
中的日期接收值更新df1
,但仅针对P
类型的产品。
下面给出了数据框架的视图以及我尝试做的事情。
df1
:
StoreName,ProdId,ProdName,DateReceived
Store A,P1,Prod1,2018-05-01
Store A,P2,Prod2,2018-05-02
Store B,P1,Prod1,2018-05-04
df2
:
DateRecived,ProdId,ProdName,Type
,P1,Prod1,P
,P2,Prod2,P
,P3,Prod3,S
脚本:
df2['DateRecived'] = df2['ProdId'].map(df1.set_index('ProdId')['StoreName']).df2['Type'] == 'P'
运行此命令会抛出以下错误:
InvalidIndexError: Reindexing only valid with uniquely valued Index objects
任何人都可以帮我修改脚本,以便我能够按Store Name
和Prod Name
过滤掉值,并使用df2
值填充DateReceived
。感谢。
答案 0 :(得分:1)
问题是重复的 - P1
产品是两次:
s = df1.set_index('ProdId')['StoreName']
print (s)
ProdId
P1 Store A
P2 Store A
P1 Store B
Name: StoreName, dtype: object
因此需要唯一值,drop_duplicates
只保留第一个值:
s = df1.drop_duplicates('ProdId').set_index('ProdId')['StoreName']
print (s)
ProdId
P1 Store A
P2 Store A
Name: StoreName, dtype: object
然后可以通过布尔掩码重新生成:
mask = df2['Type'] == 'P'
df2['DateRecived'] = df2['DateRecived'].mask(mask, df2['ProdId'].map(s))
print (df2)
DateRecived ProdId ProdName Type
0 Store A P1 Prod1 P
1 Store A P2 Prod2 P
2 NaN P3 Prod3 S
df2.loc[mask, 'DateRecived'] = df2.loc[mask, 'ProdId'].map(s)
print (df2)
DateRecived ProdId ProdName Type
0 Store A P1 Prod1 P
1 Store A P2 Prod2 P
2 NaN P3 Prod3 S