如何将条件列添加到 pandas df
How to add conditional columns to pandas df
我想在数据框中创建一个有条件地填充值的列。基本上我的数据框是这样的
Origin X
0 Guatemala x
1 China x
2 Kenya x
3 Venezuela x
4 Bangladesh x
我现在想做的是创建一个额外的列 'Continent',以添加依赖于国家/地区的大洲。我的结果如下所示:
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)
这个用 'Asia' 神秘地填充了 'continent' 中的所有列。
df['Continent'] = np.where(df['Origin'] == 'Bangladesh', 'Asia', 'unknown')
这个工作正常,因为它将 'Asia' 填入右栏,而对所有其他栏均未知,但是当我尝试制作类似 df['Continent'] = np.where(df['Origin'] == 'Bangladesh' or 'China', 'Asia', 'unknown')
的内容时,我得到了一个错误。
所以基本上我的问题是:我怎样才能用不同的值来满足我的 if 条件?
您可以为每个大洲构建列表,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'
这 returns True
因为 or 'Indonesia'
总是 True
所以所有行都设置为亚洲。
你应该改成这样:
if x['Origin'] in ('Thailand' , 'Indonesia' , 'China' , 'Japan' , 'Bangladesh'):
查看相关:How do I test one variable against multiple values?
使用 np.where
会很好,但您没有屏蔽行,因此您不断覆盖行,因此只有最后一个操作仍然存在。
我想在数据框中创建一个有条件地填充值的列。基本上我的数据框是这样的
Origin X
0 Guatemala x
1 China x
2 Kenya x
3 Venezuela x
4 Bangladesh x
我现在想做的是创建一个额外的列 'Continent',以添加依赖于国家/地区的大洲。我的结果如下所示:
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)
这个用 'Asia' 神秘地填充了 'continent' 中的所有列。
df['Continent'] = np.where(df['Origin'] == 'Bangladesh', 'Asia', 'unknown')
这个工作正常,因为它将 'Asia' 填入右栏,而对所有其他栏均未知,但是当我尝试制作类似 df['Continent'] = np.where(df['Origin'] == 'Bangladesh' or 'China', 'Asia', 'unknown')
的内容时,我得到了一个错误。
所以基本上我的问题是:我怎样才能用不同的值来满足我的 if 条件?
您可以为每个大洲构建列表,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'
这 returns True
因为 or 'Indonesia'
总是 True
所以所有行都设置为亚洲。
你应该改成这样:
if x['Origin'] in ('Thailand' , 'Indonesia' , 'China' , 'Japan' , 'Bangladesh'):
查看相关:How do I test one variable against multiple values?
使用 np.where
会很好,但您没有屏蔽行,因此您不断覆盖行,因此只有最后一个操作仍然存在。