[英]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_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.