【问题标题】:How to replace values in a dataframe with values in another dataframe based on certain condition?如何根据特定条件将数据框中的值替换为另一个数据框中的值?
【发布时间】:2017-07-27 13:28:50
【问题描述】:

我想将dataframe“result”的“q1_body”和“q2_body”列的值替换为dataframe“df”中相同id的“body”的值,代码如下:

def replace_body(x):
    id1 = result.loc[x].qid1
    result.loc[x].q1_body = df[df["qid"]==id1]["body"]
    id2 = result.loc[x].qid2
    result.loc[x].q2_body = df[df["qid"]==id2]["body"]

result.index.map(lambda x: replace_body(x))

当我运行代码时,我在 ipython 控制台中收到以下提醒,而程序只是卡在这里:

//anaconda/lib/python3.6/site-packages/pandas/core/generic.py:3110:
SettingWithCopyWarning:
正在尝试在 DataFrame 中的切片副本上设置值

请参阅文档中的注意事项:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
自我[名称] = 价值

希望有人能告诉我这里出了什么问题。

假设两个数据框是:

结果:

qid1 q1_body qid2 q2_body
 1a    abc    2a    bcd
 1a    abc    3a    cde
 2a    bcd    3a    cde

df:

qid body
1a sfgaks
2a shdfjk
3a adjkwf

预期的输出是这样的:

结果:

qid1 q1_body qid2 q2_body
 1a  sfgaks   2a  shdfjk
 1a  sfgaks   3a  adjkwf
 2a  shdfjk   3a  adjkwf

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    您需要由Series 创建的map set_index

    s = df.set_index('qid')['body']
    result['q1_body'] = result['qid1'].map(s)
    result['q2_body'] = result['qid2'].map(s)
    print (result)
      qid1 q1_body qid2 q2_body
    0   1a  sfgaks   2a  shdfjk
    1   1a  sfgaks   3a  adjkwf
    2   2a  shdfjk   3a  adjkwf
    

    【讨论】:

    • 为什么要映射? loc 会这样做,正如我在回答中所写的那样。唯一一件事,我忘了在df 上设置索引...哎呀! :-P
    • map 是更好、更明显的数据映射方式。
    • 慢于.loc。让我们做一个时间测试,好吗?
    • 需要编辑。我忘记了很多关于熊猫的事情。这几天没用过。
    • 是的,不要忘记将输出添加到您的答案中。
    【解决方案2】:

    这里:

    # Set index and get body as a series
    s = df.set_index(qid)['body']
    result['q1_body'] = s.loc[result['qid1']].values
    result['q2_body'] = s.loc[result['qid2']].values
    

    结果:

      qid1 q1_body qid2 q2_body
    0   1a  sfgaks   2a  shdfjk
    1   1a  sfgaks   3a  adjkwf
    2   2a  shdfjk   3a  adjkwf
    

    时序(10k 行,使用自动生成的 Lorem):

    我的方法

    @Jezareal 的方法

    【讨论】:

    • 谢谢。我尝试了您的解决方案,但收到此错误:“KeyError: 'None of [0 1\n1 1\n2 2\nName: qid1, dtype: object] are in the [index]'”
    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2022-07-30
    • 1970-01-01
    相关资源
    最近更新 更多