在熊猫df中移动行

时间:2018-07-27 00:47:48

标签: python pandas

我正在尝试shift中的pandas df值。具体而言,遵循特定rows的{​​{1}}。对于下面的value,我想在以上值为df时,向shift左边的row

== 'X'

出局:

d = ({
    'A' : ['Foo','','Foo',''],           
    'B' : ['X','Bar','X','Bar'],
    'C' : ['','Y','','Y'],
    })

df = pd.DataFrame(data=d)

我已经尝试过了:

     A    B  C
0  Foo    X   
1       Bar  Y
2  Foo    X   
3       Bar  Y

预期输出:

b = ['X']
x = df.B=='X'
df.loc[x, b] = df.loc[x, b].apply(lambda x: x.shift(-1), axis=1)

尽管这些 A B C 0 Foo X 1 Bar Y 2 Foo X 3 Bar Y 是相同的,但我的数据集却有所不同。 strings相同,但Foo之后的string将有所不同。因此,我不能只选择左侧的XBar shift。我需要找到row下面的row并向左移动

的东西

3 个答案:

答案 0 :(得分:1)

您可以

df.replace('',np.nan).apply(lambda x: sorted(x, key=pd.isnull), 1).fillna('')
Out[538]: 
     A  B C
0  Foo  X  
1  Bar  Y  
2  Foo  X  
3  Bar  Y  

答案 1 :(得分:1)

如果您只想摆脱空值,则可以使用列表理解,然后将其馈送到pd.DataFrame构造函数中:

res = pd.DataFrame([list(filter(None, row)) for row in df.values.tolist()],
                   columns=df.columns[:2])

print(res)

     A  B
0  Foo  X
1  Bar  Y
2  Foo  X
3  Bar  Y

答案 2 :(得分:0)

IIUC

s = (df == 'X').any(1)
idx_to_change = s[s].index+1
df.loc[idx_to_change,:] = df.loc[idx_to_change].shift(-1,axis=1)

df.fillna('')

    A   B   C
0   Foo X   
1   Bar Y
2   Foo X   
3   Bar Y