【问题标题】:pandas map column data based on value from another column using if to determine which dict to usepandas 根据另一列的值映射列数据,使用 if 来确定要使用的字典
【发布时间】:2019-03-11 08:46:47
【问题描述】:

我有以下数据框:

df = pd.DataFrame([['Person1', 'CT', 2017],
               ['Person2', 'FL', 2017],
               ['Person3', 'TX', 2017],
              ['Person1', 'TX', 2016]], columns=['Name', 'State', 'Year'])

还有下面两个映射表:

state_map = {'CT': 'Connecticut', 'FL': 'Florida', 'TX':'Texas'}
state_map2 = {'CT': 'ABC-CT', 'FL': 'BBC-Florida', 'TX':'CDA-TX'}

以下是数据的样子:

    Name    State   Year
0   Person1   CT    2017
1   Person2   FL    2017
2   Person3   TX    2017
3   Person1   TX    2016

我想找到一种方法来添加一个新列,该列的值使用 if 条件映射,该条件确定是使用从 state_map 还是 state_map2 映射的值。因此,如果 df[df['Name']=='Person1'] 则使用 state_map 否则使用 state_map2。

最终的输出应该是这样的:

    Name    State   Year   New_State_Name
0   Person1   CT    2017   Connecticut
1   Person2   FL    2017   BBC-Florida
2   Person3   TX    2017   CDA-TX
3   Person1   TX    2016   Texas

我尝试了以下代码,但没有成功。

df['New_State_Name'] = [state_map[x] if df[df['Name'] == 'Person1'] else 
state_map2[x] for x in df['State']]

我收到一条错误消息:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, 
a.bool(), a.item(), a.any() or a.all().

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用np.where:

    df['New_State_Name'] = np.where(df['Name']=='Person1',df['State'].map(state_map),df['State'].map(state_map2))
    

    输出:

          Name State  Year New_State_Name
    0  Person1    CT  2017    Connecticut
    1  Person2    FL  2017    BBC-Florida
    2  Person3    TX  2017         CDA-TX
    3  Person1    TX  2016          Texas
    

    【讨论】:

    • 谢谢,这操作简单多了,而且效果很好!我只是好奇,在列表理解中尝试使用 if 条件时我的逻辑是否不正确?
    • 当您将列表与 if 语句中的值进行比较时会发生模棱两可的错误,因此如果此列表的一部分返回 True 而部分返回 False,if 不知道该怎么做。因此,如果列表的 any() 部分结果为 True 或列表中的所有元素为 True,则必须使用另一种方法,例如 any() 或 all() 导致逻辑。
    • 感谢您的帮助!
    猜你喜欢
    • 2020-06-24
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2021-09-06
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多