遍历pandas数据框架中的行.如果特定列前存在空白,则移动所有列值



我试图遍历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

相关内容

  • 没有找到相关文章

最新更新