有一个数据框:
<!-- begin snippet: js hide: false console: true babel: false -->
> ==> index A B
> 0 1 10
> 1 1 20
> 2 1 30
> 3 2 10
我想从A列中删除重复项,但数据框的形状不受影响。
结果O / p为
> ==> Index A B
> 0 10
> 1 1 20
> 2 30
> 3 2 10
如何完成此任务。
问题来源:stackoverflow
如下所示,您可以选择重复的感兴趣的行和列('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
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。