根据条件语句在熊猫中移动列

时间:2020-08-06 14:56:24

标签: python pandas dataframe

我试图通过创建条件语句来移动数据框中的列,但是我不确定自己在做什么错。此数据框中大约有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

1 个答案:

答案 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