【问题标题】:Replace subset of Python dataframe based on condition根据条件替换 Python 数据框的子集
【发布时间】:2020-07-05 23:03:48
【问题描述】:

我有 2 个 dfs:

df = pd.DataFrame({'Friend1':['Amy','Bob','Charlie'],'Friend2':['Dan','Ellie','Fred'],'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]})

    Friend1 Friend2 a   b   c
0   Amy     Dan     1   4   7
1   Bob     Ellie   2   5   8
2   Charlie Fred    3   6   9

df2 = pd.DataFrame({'Friend1:['Zack','Yuna'],'Friend2':['Bob','Charlie'], 'b':[100,200], 'c':[300,400]})

    Friend1 Friend2 b   c
0   Zack    Bob     100 300
1   Yuna    Charlie 200 400

如何将 df2 中的内容替换为 df 以便新的 df 变为:

    Friend1 Friend2 a   b   c
0   Amy     Dan     1   4   7
1   Bob             2   100 300
2   Charlie         3   200 400

请注意,我需要在新 df 中为 Bob 和 Charlie 设置 Friend 2 为空。

我尝试过类似的东西

df.loc[df[df.Friend1.isin(['Bob','Charlie'])].index,'b':'c'] = df2.drop(['Friend1','Friend2'],axis=1)

但它不起作用。救命!

【问题讨论】:

  • 为什么需要 df2?
  • 抱歉,对于 Bob 和 Charlie,新的 df 值是错误的。已更正!

标签: python-3.x pandas dataframe subset


【解决方案1】:

您可能最终想使用df.update。首先,重新索引您的两个数据框:

df=df.set_index('Friend1')
df2=df2.set_index('Friend2')

然后根据df2中的信息更新df:

df.update(df2)

鉴于您需要在新 df 中为 Bob 和 Charlie 留空 Friend 2,您可以使用:

df.loc[df.index.isin(['Bob','Charlie']),'Friend2']=None

给你输出:

        Friend2  a      b      c
Friend1                         
Amy         Dan  1    4.0    7.0
Bob        None  2  100.0  300.0
Charlie    None  3  200.0  400.0

如果您无法重新索引,请尝试:

df.loc[df['Friend1'].isin(['Bob','Charlie']),'Friend2']=None
df.loc[df['Friend1'].isin(['Bob','Charlie']),['b','c']]=df2.loc[:,['b','c']].values

为您提供相同的输出。但这取决于您原始数据框的外观,代码不像df.update 那样动态!

【讨论】:

  • 抱歉我的新df错了!我忘了在 b 和 c 列上更改 Bob 和 Charlie 的值!
  • 我修改了答案,你现在可以试试吗?请告诉我!
  • 我不能这样做,因为我的索引值有重复,现在显示在此处的示例中 =(
  • 您在此处显示的示例绝对可以重新编制索引(我尝试使用您的 df 和 df2 并且它有效)。我可以在不使用重新索引的情况下提供答案(请参阅已编辑),但这完全取决于您的原始数据框的外观;我只能确保它适用于您的示例数据框。
  • 效果很好。我只需要最后的 .values 来使我的代码工作!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2019-07-08
  • 2022-07-30
  • 1970-01-01
相关资源
最近更新 更多