Pandas 合并并完成具有相同 ID 的行
Pandas Merge and Complete rows with same id
这是我的数据框的摘录:
ID
LU
MA
ME
JE
VE
SA
DI
200
B
B
B
201
C
C
C
C
C
211
A
211
D
D
D
211
B
213
A
A
216
K
K
K
K
216
K
217
B
B
B
B
B
我有一些相同的行 ID
并且想在完成它们时将它们“合并”成一行。
这是我想要的结果的示例:
ID
LU
MA
ME
JE
VE
SA
DI
200
B
B
B
201
C
C
C
C
C
211
A
D
D
D
B
213
A
A
216
K
K
K
K
K
217
B
B
B
B
B
我是 pandas 数据帧的新手,尝试使用 drop_duplicates
方法,但由于 keep
参数的限制,我需要一些不同的方法。
数据框也按 ID 排序。
如果每组只有一个非空值,使用:
df = df.replace('',np.nan).groupby('ID', as_index=False).first().fillna('')
如果可能有多个值并且需要原始顺序中的唯一值,请使用 lambda 函数:
print (df)
ID LU MA ME JE VE SA DI
0 201 B C B
1 201 C C C B C
f = lambda x: ','.join(dict.fromkeys(x.dropna()).keys())
df = df.replace('',np.nan).groupby('ID', as_index=False).agg(f)
print (df)
ID LU MA ME JE VE SA DI
0 201 B,C C C B C
这可以被视为一个支点。你需要先融化 df 然后旋转:
(df.melt(id_vars='ID')
.dropna()
.pivot(index='ID',columns='variable',values='value')
.fillna('')
.rename_axis(None, axis=1)
.reset_index()
)
这是我的数据框的摘录:
ID | LU | MA | ME | JE | VE | SA | DI |
---|---|---|---|---|---|---|---|
200 | B | B | B | ||||
201 | C | C | C | C | C | ||
211 | A | ||||||
211 | D | D | D | ||||
211 | B | ||||||
213 | A | A | |||||
216 | K | K | K | K | |||
216 | K | ||||||
217 | B | B | B | B | B |
我有一些相同的行 ID
并且想在完成它们时将它们“合并”成一行。
这是我想要的结果的示例:
ID | LU | MA | ME | JE | VE | SA | DI |
---|---|---|---|---|---|---|---|
200 | B | B | B | ||||
201 | C | C | C | C | C | ||
211 | A | D | D | D | B | ||
213 | A | A | |||||
216 | K | K | K | K | K | ||
217 | B | B | B | B | B |
我是 pandas 数据帧的新手,尝试使用 drop_duplicates
方法,但由于 keep
参数的限制,我需要一些不同的方法。
数据框也按 ID 排序。
如果每组只有一个非空值,使用:
df = df.replace('',np.nan).groupby('ID', as_index=False).first().fillna('')
如果可能有多个值并且需要原始顺序中的唯一值,请使用 lambda 函数:
print (df)
ID LU MA ME JE VE SA DI
0 201 B C B
1 201 C C C B C
f = lambda x: ','.join(dict.fromkeys(x.dropna()).keys())
df = df.replace('',np.nan).groupby('ID', as_index=False).agg(f)
print (df)
ID LU MA ME JE VE SA DI
0 201 B,C C C B C
这可以被视为一个支点。你需要先融化 df 然后旋转:
(df.melt(id_vars='ID')
.dropna()
.pivot(index='ID',columns='variable',values='value')
.fillna('')
.rename_axis(None, axis=1)
.reset_index()
)