簡體   English   中英

將 pandas DataFrame 行與重疊數據合並

[英]Combine pandas DataFrame rows with overlapping data

我有一個數據集,有時一行數據最終被分成兩行 Dataframe。 我能夠隔離這些行並希望將這兩行組合在一起,不幸的是,這並不總是直截了當的,因為數據首先在上游分配給數據庫。

示例 df:

import pandas as pd
import numpy as np

d = {'id':[1,2,2,3,3],
     'a1':[1,1,np.NaN,1,np.NaN],
     'b1':[1,2,np.NaN,2,np.NaN],
     'c1':[1,3,np.NaN,3,5],
     'c2':[1,4,np.NaN,4,6],
     'c3':[1,np.NaN,5,np.NaN,7],
     'c4':[1,np.NaN,6,np.NaN,np.NaN],
     'c5':[1,np.NaN,7,np.NaN,np.NaN],
     'd1':[1,np.NaN,8,np.NaN,8]}

df = pd.DataFrame(d)

    id  a1  b1  c1  c2  c3  c4  c5  d1
0   1   1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1   2   1.0 2.0 3.0 4.0 NaN NaN NaN NaN
2   2   NaN NaN NaN NaN 5.0 6.0 7.0 8.0
3   3   1.0 2.0 3.0 4.0 NaN NaN NaN NaN
4   3   NaN NaN 5.0 6.0 7.0 NaN NaN 8.0

為清楚起見,“id”上有重復項。 目的是在 df 中每個 ID 有一行。

場景 1 (ID = 2):索引 2 的值 5,6,7,8 將直接替換上面索引 1 中的 NaN 值。

場景 2 (ID = 3):索引 4 的值 5、6、7 需要移動到索引 3 內的列 C3、C4、C5,值 8 (d1) 將替換 d1/索引 3 中的 NaN 值

這在大型數據集中多次發生,並且因拆分發生的列而異,因此理想情況下,我需要能夠在找到重復 ID 的情況下動態執行此操作。

編輯:對於其他場景

d = {'id':[1,4,4],
 'a1':[1,1,np.NaN],
 'b1':[2,2,np.NaN],
 'c1':[3,3,5],
 'c2':[4,4,6],
 'c3':[5,np.NaN,np.NaN],
 'c4':[6,np.NaN,np.NaN],
 'c5':[7,np.NaN,np.NaN],
 'd1':[8,np.NaN,8]}

df2 = pd.DataFrame(d)

    id  a1  b1  c1  c2  c3  c4  c5  d1
0   1   1.0 2.0 3   4   5.0 6.0 7.0 8.0
1   4   1.0 2.0 3   4   NaN NaN NaN NaN
2   4   NaN NaN 5   6   NaN NaN NaN 8.0

場景 3 (ID = 4):與場景 2 相同,但在這種情況下 c5 (id4) 將保留為 NaN 值。

假設您始終擁有理想數量的值,您可以在沒有 NaN 的情況下按組展平:

(df.set_index('id')
   .groupby(level=0)
   .apply(lambda d: d.stack().dropna().set_axis(df.columns[1:]))
   .reset_index()
)

output:

   id   a1   b1   c1   c2   c3   c4   c5   d1
0   1  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0
1   2  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0
2   3  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0
任意數量的“id”/分組列的替代方案:
id_cols = ['id']
(df.set_index(id_cols)
   .groupby(level=range(len(id_cols)))
   .apply(lambda d: d.stack().dropna().set_axis(list(df.drop(columns=id_cols))))
   .reset_index()
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM