我试图通过创建条件语句来移动数据框中的列,但是我不确定自己在做什么错。此数据框中大约有1000多行,但这是一个示例。
原始数据框
Price Range str_num str_dir str str_sfx city zip
200 - 300k 123 Fake St Boulder 80304 None
300 - 400k 456 Main St Erie 80123 None
300 - 400k 789 E Lolly St Boulder 80302
300 - 400k 999 N Home Ave Lafayette 80027
现在我要说的是,如果列str_dir
中没有N,E,W,S,将其向右移动,并用NaN填充其余部分。到目前为止,这是我的代码。
mylist = ['N','E','W','S']
a=df[~df['str_dir'].isin(mylist)].shift(periods=-1, axis='columns', fill_value=np.NaN)
out_df=a.combine_first(df)
但是,当我运行这段代码时,我得到了这个数据框。
Price Range str_num str_dir str city zip
123 Fake St Boulder 80304 None
456 Main St Erie 80123 None
300 - 400k 789 E Lolly Boulder 80302
300 - 400k 999 N Home Lafayette 80027
我要找的是这个
Price Range str_num str_dir str str_sfx city zip
200 - 300k 123 NaN Fake St Boulder 80304
300 - 400k 456 NaN Main St Erie 80123
300 - 400k 789 E Lolly St Boulder 80302
300 - 400k 999 N Home Ave Lafayette 80027
答案 0 :(得分:1)
使用Series.isin
创建布尔掩码m
,然后将DataFrame.loc
与掩码m
一起使用,以选择需要使用{{ 3}}和axis=1
:
m = ~df['str_dir'].isin(mylist)
df.loc[m, 'str_dir':] = df.loc[m, 'str_dir':].shift(axis=1)
结果:
Price Range str_num str_dir str str_sfx city zip
0 200 - 300k 123 NaN Fake St Boulder 80304
1 300 - 400k 456 NaN Main St Erie 80123
2 300 - 400k 789 E Lolly St Boulder 80302
3 300 - 400k 999 N Home Ave Lafayette 80027