Pandas:比较行值并修改下一列的行值

2024-06-29 00:57:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧:

    A                             B
0   xyz                          Lena
1   NaN                          J.Brooke
2   NaN                          B.Izzie
3   NaN                          B.Rhodes
4   NaN                          J.Keith        
.....  

我想比较B列的值,如果行值以B开头,那么在它的相邻行中,应该写入一个新的列,同样地,如果J,那么应该写入旧的列。下面是我所期待的:

    A                             B
0   xyz                         Lena
1   old                         J.Brooke
2   new                         B.Izzie
3   new                         B.Rhodes
4   old                         J.Keith        
.....  

我不明白我怎么能做到这一点。首先,我可以使用startswith(),但是如何比较一行值,然后将所需的字段值放在另一列的相邻行中呢? 这是一个小案例,我尝试了很多更复杂的事情…熊猫确实很强大!你知道吗


Tags: 数据newnan事情old案例段值xyz
3条回答

使用pd.Series.fillna

df['A'].fillna(df['B'].str[0].replace({'J': 'old', 'B': 'new'}))

输出:

     A         B
0  xyz      Lena
1  old  J.Brooke
2  new   B.Izzie
3  new  B.Rhodes
4  old   J.Keith

如果需要按条件设置新值,请将^{}^{}一起使用:

m1 = df['B'].str.startswith('B')
m2 = df['B'].str.startswith('J')

如果还需要通过^{}测试缺失值链条件:

m1 = df['B'].str.startswith('B') & df['A'].isna()
m2 = df['B'].str.startswith('J') & df['A'].isna()

df['A'] = np.select([m1, m2], ['new','old'], df['A'])
print (df)
     A         B
0  xyz      Lena
1  old  J.Brooke
2  new   B.Izzie
3  new  B.Rhodes
4  old   J.Keith

或者使用^{}

df.loc[m1, 'A'] = 'new'
df.loc[m2, 'A'] = 'old'

尝试使用loc
我添加了.isnull()检查,因为如果colA中已经存在某些内容,则不会被替换,但如果不希望,则可以忽略该检查

import pandas 
df = pd.DataFrame(data={'colA':["xyz",np.nan,np.nan,np.nan,np.nan],
                   "colB":['Lena','J.Brooke','B.Izzie','B.Rhodes','J.Keith']})

df.loc[(df['colA'].isnull()) &(df['colB'].str.startswith("B")),"colA"] = "new"
df.loc[(df['colA'].isnull()) &(df['colB'].str.startswith("J")),"colA"] = "old"
print(df)
   colA      colB
0  xyz      Lena
1  old  J.Brooke
2  new   B.Izzie
3  new  B.Rhodes
4  old   J.Keith

相关问题 更多 >