我试图遍历pandas数据框中的所有行,并在每行中移动所有最左边的列,直到每行中的所有非空列值触摸。列移动的数量取决于第一个空值和截止列之间的空列的数量。
在这种情况下,我试图将最左边列中的值"关闭"到触及特定截止列"eee"的列"d"。相关的"abc"行应该有助于将问题可视化。
列'eee'或'eee'右边的列不应该被触摸或移动
def moveOver ():
df = {
'aaa': ['a', 'a', 'a', 'a', 'a', 'a'],
'bbb': ['', 'b', 'b', 'b', '', 'b'],
'ccc': ['', '', 'c', 'c', '', 'c'],
'ddd': ['', '', '', 'd', '', ''],
'eee': ['b', 'c', 'd', 'e', 'b', 'd'],
'fff': ['c', 'd', 'e', 'f', 'c', 'e'],
'ggg': ['d', 'e', 'f', 'g', 'd', 'f']
}
在第1行和第5行:'a'将被移动到列'ddd'
在第2行:['a','b']将分别移动到2列索引的列['ccc', 'ddd']
等。
finalOutput = {
'aaa': ['', '', '', 'a', '', ''],
'bbb': ['', '', 'a', 'b', '', 'a'],
'ccc': ['', 'a', 'b', 'c', '', 'b'],
'ddd': ['a', 'b', 'c', 'd', 'a', 'c'],
'eee': ['b', 'c', 'd', 'e', 'b', 'd'],
'fff': ['c', 'd', 'e', 'f', 'c', 'e'],
'ggg': ['d', 'e', 'f', 'g', 'd', 'f']
}
你可以这样做:
keep_cols = df.columns[0:df.columns.get_loc('eee')]
df.loc[:,keep_cols] = [np.roll(v, Counter(v)['']) for v in df[keep_cols].values]
印刷(df):
aaa bbb ccc ddd eee fff ggg
0 a b c d
1 a b c d e
2 a b c d e f
3 a b c d e f g
4 a b c d
5 a b c d e f
解释:
你想只考虑那些列在'ee '的左边,所以你把这些列存储在keep_cols
接下来你想要每一行移动一些量(我们需要知道多少),我用numpy的
roll
来移动。但是多少钱呢?它由空白值的数量给出-为此我使用了集合中的Counter
。