Python:按 CSV 中的唯一列合并重复项
Python: merge duplicates by unique column in CSV
我的 python 代码有问题。我正在尝试合并数据框中的行。我有这样的东西:
CODE_ID
SIZE
1
2
3
4
...
18
CODE
12345
Big
X
.
.
.
...
.
abc
12345
Big
.
X
.
.
...
.
def
67890
Medium
.
.
.
X
...
.
ghi
67890
Medium
.
.
X
.
...
.
jkl
13579
Small
.
.
.
X
...
.
xyz
我想按 CODE_ID 合并重复项,但我想加入 CODE 列中的字符串。就这样:
CODE_ID
SIZE
1
2
3
4
...
18
CODE
12345
Big
X
X
.
.
...
.
abc; def
67890
Medium
.
.
X
X
...
.
ghi; jkl
13579
Small
.
.
.
X
...
.
xyz
我是用 agg 做的,但这只是工作的一部分。
g_df = df.groupby("CODE_ID")
group = g_df["CODE"].agg(lambda column: "; ".join(column))
group = group.reset_index(name="CODE")
因为结果是这样的:
CODE_ID
CODE
12345
abc; def
67890
ghi; jkl
13579
xyz
如何添加其余的列?或者这样做的方法不对?
您可以将 X
s 和 .
s 转换为 1/0,然后 groupby
和 max
,并将其映射回 X
s和 .
s:
(df
.set_index(['CODE_ID', 'SIZE'])
.filter(regex='\d+') # numeric column names
.replace({'X': 1, '.': 0}) # map to 1/0s
.groupby(level=[0, 1]) # groupby code and size
.max() # max
.replace({1: 'X', 0: '.'}) # map back to X/.
).merge( # add ;-separated codes
df.groupby(['CODE_ID', 'SIZE'])["CODE"].apply('; '.join),
left_index=True,
right_index=True,
)
输出:
CODE_ID SIZE 1 2 3 4 18 CODE
0 12345 Big X X . . . abc; def
1 13579 Small . . . X . xyz
2 67890 Medium . . X X . ghi; jkl
我的 python 代码有问题。我正在尝试合并数据框中的行。我有这样的东西:
CODE_ID | SIZE | 1 | 2 | 3 | 4 | ... | 18 | CODE |
---|---|---|---|---|---|---|---|---|
12345 | Big | X | . | . | . | ... | . | abc |
12345 | Big | . | X | . | . | ... | . | def |
67890 | Medium | . | . | . | X | ... | . | ghi |
67890 | Medium | . | . | X | . | ... | . | jkl |
13579 | Small | . | . | . | X | ... | . | xyz |
我想按 CODE_ID 合并重复项,但我想加入 CODE 列中的字符串。就这样:
CODE_ID | SIZE | 1 | 2 | 3 | 4 | ... | 18 | CODE |
---|---|---|---|---|---|---|---|---|
12345 | Big | X | X | . | . | ... | . | abc; def |
67890 | Medium | . | . | X | X | ... | . | ghi; jkl |
13579 | Small | . | . | . | X | ... | . | xyz |
我是用 agg 做的,但这只是工作的一部分。
g_df = df.groupby("CODE_ID")
group = g_df["CODE"].agg(lambda column: "; ".join(column))
group = group.reset_index(name="CODE")
因为结果是这样的:
CODE_ID | CODE |
---|---|
12345 | abc; def |
67890 | ghi; jkl |
13579 | xyz |
如何添加其余的列?或者这样做的方法不对?
您可以将 X
s 和 .
s 转换为 1/0,然后 groupby
和 max
,并将其映射回 X
s和 .
s:
(df
.set_index(['CODE_ID', 'SIZE'])
.filter(regex='\d+') # numeric column names
.replace({'X': 1, '.': 0}) # map to 1/0s
.groupby(level=[0, 1]) # groupby code and size
.max() # max
.replace({1: 'X', 0: '.'}) # map back to X/.
).merge( # add ;-separated codes
df.groupby(['CODE_ID', 'SIZE'])["CODE"].apply('; '.join),
left_index=True,
right_index=True,
)
输出:
CODE_ID SIZE 1 2 3 4 18 CODE
0 12345 Big X X . . . abc; def
1 13579 Small . . . X . xyz
2 67890 Medium . . X X . ghi; jkl