【问题标题】:How to add conditional columns to pandas df如何将条件列添加到熊猫 df
【发布时间】:2016-01-25 11:17:19
【问题描述】:

我想在数据框中创建一个有条件地填充值的列。基本上我的数据框是这样的

  Origin     X
0 Guatemala  x
1 China      x
2 Kenya      x
3 Venezuela  x
4 Bangladesh x

我现在要做的是创建一个附加列“大陆”,它添加了依赖于国家/地区的大陆。我的结果如下所示:

 Origin      X  Continent
0 Guatemala  x  South america
1 China      x  Asia
2 Kenya      x  Africa
3 Venezuela  x  South america
4 Bangladesh x  Asia

我已经尝试了以下代码来接受我想要的:

def GetContinents(x):
    if x['Origin']== 'Thailand' or 'Indonesia' or 'China' or 'Japan' or 'Bangladesh':
        return 'Asia'
    elif x['Origin']== 'Boliva' or 'Guatemala' or 'Venezuela' or 'Mexico' or 'Argentinia':
        return 'South America'
    elif x['Origin']== 'Guinea Bissau' or 'Egypt' or 'Zaire' or 'Kenya':
        return 'Africa'
    else:
        return 'unknown'

df['Continent']= df.apply(GetContinents, axis=1)

这个神秘地用“亚洲”填充了“大陆”的所有列。

df['Continent'] = np.where(df['Origin'] == 'Bangladesh', 'Asia', 'unknown')

这个工作正常,它将“亚洲”填充到正确的列中,而将未知填充到所有其他列中,但是当我尝试制作类似 df['Continent'] = np.where(df['Origin'] == 'Bangladesh' or 'China', 'Asia', 'unknown') 的内容时,我得到了一个错误。

所以基本上我的问题是:我怎样才能用不同的值来满足我的 if 条件?

【问题讨论】:

    标签: python if-statement pandas conditional dataframe


    【解决方案1】:

    您可以为每个大陆和apply 一个函数构建列表:

    In [35]:
    asia = ['Thailand','Indonesia','China','Japan','Bangladesh']
    south_america = ['Boliva' , 'Guatemala' , 'Venezuela' , 'Mexico' , 'Argentinia']
    africa = [ 'Guinea Bissau' , 'Egypt' , 'Zaire' , 'Kenya']
    def find_continent(x):
        if x in asia:
            return 'Asia'
        elif x in south_america:
            return 'South America'
        elif x in africa:
            return 'Africa'
        else:
            return 'Unknown'
    df['Continent'] = df['Origin'].apply(find_continent)
    df
    
    Out[35]:
           Origin  X      Continent
    0   Guatemala  x  South America
    1       China  x           Asia
    2       Kenya  x         Africa
    3   Venezuela  x  South America
    4  Bangladesh  x           Asia
    

    或者,如果您的 df 更大,那么您可以使用 isin 进行连续调用并使用 loc 屏蔽行:

    In [38]:
    df.loc[df['Origin'].isin(asia),'Continent'] = 'Asia'
    df.loc[df['Origin'].isin(south_america),'Continent'] = 'South America'
    df.loc[df['Origin'].isin(africa),'Continent'] = 'Africa'
    df['Continent'] = df['Continent'].fillna('Unknown')
    df
    
    Out[38]:
           Origin  X      Continent
    0   Guatemala  x  South America
    1       China  x           Asia
    2       Kenya  x         Africa
    3   Venezuela  x  South America
    4  Bangladesh  x           Asia
    

    为什么你的尝试没有成功:

    if x['Origin']== 'Thailand' or 'Indonesia' or 'China' or 'Japan' or 'Bangladesh'
    

    这将返回 True,因为 or 'Indonesia' 始终为 True,因此所有行都设置为亚洲。

    你应该把它改成这样:

    if x['Origin'] in ('Thailand' , 'Indonesia' , 'China' , 'Japan' , 'Bangladesh'):
    

    查看相关:How do I test one variable against multiple values?

    使用np.where 会很好,但您不会屏蔽行,因此您会不断覆盖行,因此只有最后一个操作仍然存在。

    【讨论】:

    • 太棒了!也感谢您解释为什么我的代码不起作用!
    猜你喜欢
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2021-04-30
    相关资源
    最近更新 更多