簡體   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