根据条件从另一个数据框中复制列值

时间:2020-06-01 13:52:24

标签: pandas list dataframe

让我们说我有两个数据帧: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”的列,该列在每个数据帧中均保证是唯一的。

我要:

  1. 在df1中创建一个新列,并将其初始化为0。 df1['grade']=0
  2. 将df2 ['grade']的值复制到df1 ['grade'],确保每个这样的副本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”列值。我该怎么做?

1 个答案:

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