Python 根据条件更改整个熊猫系列
在我的pandas数据框中,我想根据另一列(Python 根据条件更改整个熊猫系列,python,pandas,dataframe,series,Python,Pandas,Dataframe,Series,在我的pandas数据框中,我想根据另一列(OldCol)的数据所遵循的一些条件,添加一个新列(NewCol) 更具体地说,我的列OldCol包含三种类型的字符串: BB_sometext sometext1 一些文字1 我想区分这三种类型的字符串。现在,我使用以下代码完成了此操作: df['NewCol'] = pd.Series() for i in range(0, len(df)): if str(df.loc[i, 'OldCol']).split('_')[0] == "BB
OldCol
)的数据所遵循的一些条件,添加一个新列(NewCol
)
更具体地说,我的列OldCol
包含三种类型的字符串:
df['NewCol'] = pd.Series()
for i in range(0, len(df)):
if str(df.loc[i, 'OldCol']).split('_')[0] == "BB":
df.loc[i, 'NewCol'] = "A"
elif len(str(df.loc[i, 'OldCol']).split(' ')) == 1:
df.loc[i, 'NewCol'] = "B"
else:
df.loc[i, 'NewCol'] = "C"
尽管这段代码看起来很有效,但我确信有更好的方法来做类似的事情,因为这似乎效率很低。有人知道更好的方法吗?提前感谢。通常,您需要以下配方:
>>> df.loc[boolean_test, 'NewCol'] = desired_result
或者,(注意每个条件周围的括号,以及相当不和谐的和,而不是和):
例子
让我们从一个示例开始Data.Frame
:
>>> df = pd.DataFrame(dict(OldCol=['sometext1', 'sometext 1', 'BB_ccc', 'sometext1']))
然后你会做:
>>> df.loc[df['OldCol'].str.split('_').str[0] == 'BB', 'NewCol'] = "A"
将所有BB\uu
列设置为A
。您甚至可以(可选地,为了可读性)将布尔条件分离到自己的行中:
>>> oldcol_starts_BB = df['OldCol'].str.split('_').str[0] == 'BB'
>>> df.loc[oldcol_starts_BB, 'NewCol'] = "A"
我喜欢这种方法,因为它意味着读者不必计算出split(“''').str[0]
部分中隐藏的逻辑
然后,要设置所有仍未设置的没有空格的列(即,isnull
为真):
>>> oldcol_starts_BB = df['OldCol'].str.split('_').str[0] == 'BB'
>>> df.loc[oldcol_starts_BB, 'NewCol'] = "A"
>>> oldcol_has_no_space = df['OldCol'].str.find(' ') < 0
>>> newcol_is_null = df['NewCol'].isnull()
>>> df.loc[(oldcol_has_no_space) & (newcol_is_null), 'NewCol'] = 'C'
>>> df.loc[df['NewCol'].isnull(), 'NewCol'] = 'B'
>>> df
OldCol NewCol
0 sometext1 C
1 sometext 1 B
2 BB_ccc A
3 sometext1 C