如下,您可以选择重复的感兴趣的行和列('A')并将值设置为NAN。
# create df
df = pd.DataFrame([
[1, 10],
[1, 20],
[1, 30],
[2, 10]],
columns=['A', 'B'])
# replace duplicated elements with NAN, preserving the row
df.loc[df.duplicated(subset='A', keep='first'), 'A'] = np.nan
原表:
A B
0 1 10
1 1 20
2 1 30
3 2 10
修改表:
A B
0 1.0 10
1 NaN 20
2 NaN 30
3 2.0 10
列“A”成为支持 NaN 的浮点数据类型。
使用duplicated,您可以将元素的第一个 (keep='first') 或最后一个 (keep='last') 指定为原始元素 - 就像它一样 - 其他相同元素被视为重复元素。
与@Quang Hoang 的评论有关,duplicated 中没有选择任意中间元素的逻辑,如您的示例所示。
*************************** 以下响应 ****************** *********
根据您的回复,我想我明白您想要什么了。以下是非矢量化方法,只要您的数据框不大,就应该没问题。它将重复的 B 值保存到列表中(见下文)
# create sample dataframe
df = pd.DataFrame([
[1, 10],
[1, 20],
[1, 30],
[2, 10],
[3, 15],
[3, 20]],
columns=['A', 'B'])
# create a dictionary where unique column A values are keys, and values are all the column B values for a given key (whether the A value is a duplicate or not)
dictionary = dict()
for value in df.A.unique():
if len(df.loc[(df.A == value) & df.A.duplicated(keep=False)]) > 0:
all_values = df.loc[(df.A == value) & df.A.duplicated(keep=False), 'B'].tolist()
dictionary[value] = all_values
elif len(df.loc[(df.A == value) & df.A.duplicated(keep=False)]) == 0:
dictionary[value] = df.loc[(df.A == value), 'B'].tolist()
# make a new dataframe
df2 = pd.DataFrame(columns=['A', 'B'])
df2.A = list(dictionary.keys())
df2.B = list(dictionary.values())
结果是这样的:
A B
0 1 [10, 20, 30]
1 2 [10]
2 3 [15, 20]
如果您想删除原始数据帧以释放内存:del df