我有这个熊猫数据框:
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()
,但是如何比较一个行值,然后在另一列的相邻行中拥有所需的字段值呢?
这是一个小案例,我正在尝试很多更复杂的事情……熊猫确实功能强大!
答案 0 :(得分:2)
如果需要根据条件设置新值,请将numpy.select
与Series.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