让我们说我有两个数据帧:df1 and df2
。假定以下初始值。
df1=pd.DataFrame({'ID':['ASX-112','YTR-789','ASX-124','UYT-908','TYE=456','ERW-234','UUI-675','GHV-805','NMB-653','WSX-123'],
'Costperlb':[4515,5856,3313,9909,8980,9088,6765,3456,9012,1237]})
df2=df1[df1['Costperlb']>4560]
如您所见,df2是df1的适当子集(它是通过对行选择施加条件从df1创建的。)
我在df2中添加了一列,其中包含基于计算的某些值。让我们称之为df2 ['grade']。
df2['grade']=[1,4,3,5,1,1]
df1和df2包含一个名为“ ID”的列,该列在每个数据帧中均保证是唯一的。
我要:
df1['grade']=0
。df1['ID']=df2['ID']
。结果应为复制的相应ID的等级值。
第2步让我有些困惑。天真的df1['grade']=df2['grade'].values
显然不能正常工作,因为两个数据帧的长度不同。
现在,如果我想得足够认真的话,我可能会想出一个像这样的怪兽:
df1['grade'].loc[(df1['ID'].isin(df2)) & ...]
,但我对此感到不舒服。
我是python的新手,此外,在执行此赋值操作后,df1的索引已在其他地方使用,我不希望删除索引,请重置索引,因为我在某些搜索结果中建议了某些解决方案
我只想查找df1中的行,其中“ ID”行与df2中的“ ID”行匹配,然后在该特定行中复制“ grade”列值。我该怎么做?
答案 0 :(得分:1)
您的代码:
df1=pd.DataFrame({'ID':['ASX-112','YTR-789','ASX-124','UYT-908','TYE=456','ERW-234','UUI-675','GHV-805','NMB-653','WSX-123'],
'Costperlb':[4515,5856,3313,9909,8980,9088,6765,3456,9012,1237]})
df2=df1[df1['Costperlb']>4560]
df2['grade']=[1,4,3,5,1,1]
您可以使用带有“ left”的合并。这样可以保留df1的索引:
new_df = df1.merge(df2[["ID","grade"]], on="ID", how="left")
new_df["grade"] = new_df["grade"].fillna(0)
new_df
输出:
ID Costperlb grade
0 ASX-112 4515 0.0
1 YTR-789 5856 1.0
2 ASX-124 3313 0.0
3 UYT-908 9909 4.0
4 TYE=456 8980 3.0
5 ERW-234 9088 5.0
6 UUI-675 6765 1.0
7 GHV-805 3456 0.0
8 NMB-653 9012 1.0
9 WSX-123 1237 0.0
在这里,我将合并的数据帧称为new_df,但是您可以将其更改为df1。
编辑
如果您要用字符串代替NaN而不是0,请尝试以下操作:
new_df = df1.merge(df2[["ID","grade"]], on="ID", how="left")
new_df["grade"] = new_df["grade"].fillna("No transaction possible")
new_df
输出:
ID Costperlb grade
0 ASX-112 4515 No transaction possible
1 YTR-789 5856 1
2 ASX-124 3313 No transaction possible
3 UYT-908 9909 4
4 TYE=456 8980 3
5 ERW-234 9088 5
6 UUI-675 6765 1
7 GHV-805 3456 No transaction possible
8 NMB-653 9012 1
9 WSX-123 1237 No transaction possible