我有一个熊猫数据框,如下所示:
Name
现在,我想将新列中的某些值分配给包含一些子字符串的text
列。例如,如果它包含星期一,那么我们将as
分配给他们,如果它包含city
,我们将 +------+---+----+
|Name |age|new |
+------+---+----+
|Mona |12 |text|
+------+---+----+
|Monika|25 |text|
+------+---+----+
|Tomas |3 |city|
+------+---+----|
|Ilyas |47 |city|
+------+---+----+
分配给他们。
所以输出必须是:
df['new'] = np.nan
df['new'] = df['new'].mask( 'Mon' in df['Name'], 'text')
df['new'] = df['new'].mask( 'as' in df['Name'], 'city')
我写了以下代码,但没有用:
class AnimalPlanet {
"lions" should "return the name of the lion" in {
println(lion.name)
}
}
答案 0 :(得分:1)
如果您的逻辑变得复杂,则可能需要将映射封装到一个函数中:
def map_func(name):
if 'Mon' in name:
return 'text'
elif 'as' in name:
return 'city'
df['Name'].map(map_func)
结果:
0 text
1 text
2 city
3 city
Name: Name, dtype: object
答案 1 :(得分:0)
这应该做:
df['new']=np.where(df.Name.str.contains('Mon'), 'text', 'city')
np.where
的工作方式类似于Excel的IF
:如果满足条件,则用'text'填充,否则用'city'填充。
答案 2 :(得分:0)
Df.loc[df.name.str.endswith('as'), 'new'] = 'city'
Df.loc[df.name.str.startswith('Mon'), 'new'] = 'text'
Str有一种用于此类问题的方法startsWith和endsWith。 也许可以单行完成,但是现在我什么都没想到。
Loc始终有助于选择和更新条件数据。
编辑:Juan C是正确的,应该是“包含”而不是“ startsWith”,我不好。
答案 3 :(得分:0)
我认为这是最好的选择,因为它将处理不区分大小写的匹配并在不满足任何条件的情况下填充NaN
。
import numpy as np
Name Age
0 Mona 12
1 Monika 25
2 Tomas 3
3 Ilyas 47
default = np.where(df.Name.str.contains('as', case=False), 'city', np.nan)
cond = np.where(df.Name.str.contains('Mon', case=False), 'text', default)
df.assign(new=cond)
Name Age new
0 Mona 12 text
1 Monika 25 text
2 Tomas 3 city
3 Ilyas 47 city