我正在尝试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
将有所不同。因此,我不能只选择左侧的X
和Bar
shift
。我需要找到row
下面的row
并向左移动
答案 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