【问题标题】:Python: IF Statement inside For LoopPython:For循环内的IF语句
【发布时间】:2021-12-31 19:50:51
【问题描述】:

我想创建一个新列,然后使用另一个参数作为填充该列的条件。

这是我的代码,但它不会继续 elif。只有第一个参数在应用,即使它不符合我设置的参数。

for i in df_csrdata_2mos_Filtered_Done["Agent"]:
    if i == "unez" or i == "rmbua" or i == "destrada" or i == "amateo" or i == "cmabelison":
        df_csrdata_2mos_Filtered_Done["AgentTag"] = "Agent 1"
    elif i == "rverga" or i == "dpcaban" or i == "dgsugui":
        df_csrdata_2mos_Filtered_Done["AgentTag"] = "Agent 2"
    elif i == "gmic" or i == "jdera":
        df_csrdata_2mos_Filtered_Done["AgentTag"] = "Agent 3"
    elif i == "gras" or i == "mcsrra":
        df_csrdata_2mos_Filtered_Done["AgentTag"] = "Agent 4"
    elif i == "jcawan" or i == "rmcola" or i == "mjgamo":
        df_csrdata_2mos_Filtered_Done["AgentTag"] = "Agent 5"
    elif i == "ychaco" or i == "phondra":
        df_csrdata_2mos_Filtered_Done["AgentTag"] = "Agent 6"
    elif i == "mmorang" or i == "vsin":
        df_csrdata_2mos_Filtered_Done["AgentTag"] = "Agent 7"
    elif i == "pbong":
        df_csrdata_2mos_Filtered_Done["AgentTag"] = "Agent 8"
    else:
        print("AgentTag Done!")

【问题讨论】:

  • 当你说代码“doest(sic) continue to elif”是什么意思? df_csrdata_2mos_Filtered_Done 是什么? df_csrdata_2mos_Filtered_Done["Agent"] 的值是多少?

标签: python pandas for-loop if-statement


【解决方案1】:

你的 if/elif 工作正常。

基于df_,我假设您正在使用 Pandas 数据帧,在这种情况下,只是df_csrdata_2mos_Filtered_Done["AgentTag"] = "X" 将整个系列替换为新值。

>>> df = pd.DataFrame({"a": [1, 2, 3]})
>>> df
   a
0  1
1  2
2  3
>>> df["b"] = "Agent Perry"
>>> df
   a            b
0  1  Agent Perry
1  2  Agent Perry
2  3  Agent Perry
>>>

如果最后一个 Agent"pbong",则 df 中的所有 AgentTag 都是 Agent 8。

看起来你正在寻找带有字典的Series.map()

>>> agent_map = {
...     "unez": "Agent 1",
...     "rverga": "Agent 2",
... }
>>> df = pd.DataFrame({"agent": ["unez", "rverga", "hello"]})
>>> df
    agent
0    unez
1  rverga
2   hello
>>> df["AgentTag"] = df["agent"].map(agent_map)
>>> df
    agent AgentTag
0    unez  Agent 1
1  rverga  Agent 2
2   hello      NaN
>>>

【讨论】:

    【解决方案2】:

    不要使用循环,这里没有必要。

    最好是Series.map映射:

    d = {
        "Agent 1": ["unez", "rmbua", "destrada", "amateo", "cmabelison"],
        "Agent 2": ["rverga", "dpcaban", "dgsugui"],
        "Agent 3": ["gmic", "jdera"],
        "Agent 4": ["gras", "mcsrra"],
        "Agent 5": ["jcawan", "rmcola", "mjgamo"],
        "Agent 6": ["ychaco", "phondra"],
        "Agent 7": ["mmorang", "vsin"],
        "Agent 8": ["pbong"],
    }
    
    # flatten lists
    d1 = {k: oldk for oldk, oldv in d.items() for k in oldv}
    
    df_csrdata_2mos_Filtered_Done["AgentTag"] = df_csrdata_2mos_Filtered_Done["Agent"].map(d1)
    

    【讨论】:

    • 这很可悲……但无论如何,不​​要受到它的影响;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多