【问题标题】:Creating a new column by referencing other columns from a data frame in python通过在 python 中引用数据框中的其他列来创建新列
【发布时间】:2020-06-20 17:53:16
【问题描述】:

我想创建一个标记为Region 的新列,它将整数范围与通过字典显示的区域相关联。但是,有一个条件:子细分市场需要是澳大利亚。

import pandas as pd
import numpy as np

df = pd.read_excel(r'/Users/Desktop/dictionary.xlsx')
mydict = {"NSW": range(1000,1209)}

if df['Sub-Segment'] == "Australia":
    df['Region'] = df['Postal Code'].map(mydict) 

数据框如下所示:

Sub-Segment Postal Code
Australia   1001
Australia   1002
Australia   1209
Mexico      1004

想要的数据框是这样的:

Sub-Segment Postal Code  Region
Australia   1001         NSW
Australia   1002         NSW
Australia   1209         NSW
Mexico      1004         Other

我尝试了上述方法并收到以下错误消息:

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

【问题讨论】:

  • 所以,只是为了正确理解。你有一本字典,其中地区是关键,邮政编码是价值?或者你有一个字典,其中区域是键,值是列表/范围或值?

标签: python pandas dictionary mapping


【解决方案1】:
mydict={
    "NSW": range(1000, 1210),
    "NHL": range(2000, 2099),
}

def region(df):
    if df['Sub-Segment'] == 'Australia':
        result = [key for (key, value) in mydict.items() if df['Postal Code'] in value]
        if result:
            return result[0]
    return 'Other'

df['Region'] = df.apply(lambda row: region(row), axis=1)

【讨论】:

  • 如果我有多个范围,例如如果 2000--299 我希望区域为“NHL”,该怎么办?它是如何工作的?
【解决方案2】:

我不确定你要把字典放在哪里。因为如果你使用字典,你必须有大量的键,所以我更喜欢使用函数。
您可以使用pandas.DataFrame.loc 获取您想要的行并使用pandas.DataFrame.apply 应用该功能。

import pandas as pd
import numpy as np

df=pd.read_excel(r'/Users/Desktop/dictionary.xlsx' )

def func(x):
    if 1000<=x<=1209:
        return 'NSW'
    else:
        # some other stuff maybe?
        pass

df.loc[df['Sub-Segment']=="Australia",'Region']=df['PostalCode'].apply(func)
df = df.fillna('Other')
print(df)

【讨论】:

    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2020-12-05
    • 1970-01-01
    • 2015-09-19
    • 2020-10-03
    相关资源
    最近更新 更多