Python 按顺序移动行
我正在尝试Python 按顺序移动行,python,pandas,Python,Pandas,我正在尝试转换中的值。具体地说,是在特定的值之后的行。对于下面的df,当上面的值为==“X”时,我想将行移到左侧 d = ({ 'A' : ['Foo','','Foo',''], 'B' : ['X','Bar','X','Bar'], 'C' : ['','Y','','Y'], }) df = pd.DataFrame(data=d) 输出: 我试过这个: b = ['X'] x = df.B=='X' df.loc[x, b] =
转换中的值。具体地说,是在特定的值之后的行
。对于下面的df
,当上面的值为==“X”
时,我想将行
移到左侧
d = ({
'A' : ['Foo','','Foo',''],
'B' : ['X','Bar','X','Bar'],
'C' : ['','Y','','Y'],
})
df = pd.DataFrame(data=d)
输出:
我试过这个:
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
虽然这些字符串
是相同的,但我的数据集是不同的Foo
将是相同的,但是X
后面的字符串将有所不同。所以我不能只选择Bar
和shift
行
左键。我需要找到行下面X
并向左移动的东西
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
IIUC
你能行
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
你能行
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
如果只想去掉空值,可以使用列表理解,然后将其馈送到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
如果只想去掉空值,可以使用列表理解,然后将其馈送到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
是否X
仅在B列?是。它不在其他任何地方复制@RafaelC.IsX
仅在B列?是的。它在其他任何地方都不会复制@RafaelC.在这里产生一系列列表?@RafaelC这里的列表是什么意思?我得到了一个pd.series
的list
,比如,0[Foo,X,nan]1[Bar,Y,nan]2[Foo,X,nan]3[Foo,W,P]4[Bar,Y,nan]dtype:object
@RafaelC-idk为什么在这里有列表,但在我这一方,它会返回dataframe@RafaelC也许重新启动你的Jupter会在这里产生一系列列表?@RafaelC这里的列表是什么意思?我得到一个pd.series
的list
,比如,0[Foo,X,nan]1[Bar,Y,nan]2[Foo,X,nan]3[Foo,W,P]4[Bar,Y,nan]dtype:object
@RafaelC idk为什么在这里有列表,但在我这边它返回dataframe@RafaelC也许重新启动你的jupter