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

时间:2019-07-09 06:50:30

标签: python pandas csv

我有这个熊猫数据框:

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

我想比较B列的值,以便如果行值以B开头,则应在A列的相邻行中写入一个新值,如果J则为旧值,则应类似地写入。以下是我的期望:

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

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

3 个答案:

答案 0 :(得分:2)

如果需要根据条件设置新值,请将numpy.selectSeries.str.startswith一起使用:

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

如果还需要通过Series.isna测试缺失值链条件:

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

或使用DataFrame.loc

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

答案 1 :(得分:2)

尝试使用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

答案 2 :(得分:1)

使用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