繁体   English   中英

遍历 pandas 数据框中的行。 如果特定列之前存在空白,则将所有列值移到

[英]Iterate over rows in pandas dataframe. If blanks exist before a specific column, move all column values over

我正在尝试遍历 pandas 数据框中的所有行并将每行中的所有最左边的列移动,直到每行中的所有非空列值都接触。 列移动量取决于第一个空值和截止列之间的空列数。

在这种情况下,我试图将最左侧列中的值之间的差距“缩小”到“d”列中,从而触及特定的截止列“eee”。 相关的“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”将移动到 3 列索引上的“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

解释:

  • 您只想考虑“eee”左侧的那些列,因此您将这些列存储在 keep_cols

  • 接下来,您希望每行移动一定量(我们需要知道多少),以移动我使用 numpy 的roll 但是多少钱? 它由空白值的数量给出 - 为此我使用了集合中的Counter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM