Pandas:InvalidIndexError:重新索引仅对具有唯一值的Index对象有效

时间:2018-05-17 10:24:20

标签: python pandas dataframe

我有两个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 NameProd Name过滤掉值,并使用df2值填充DateReceived。感谢。

1 个答案:

答案 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