请注意,我已经查看了此链接
Pandas and python: deduplication of dataset by several fields *
- 7月18日更新:我的观点是,所有这些解决方案都指向避免索引,直到所有重复数据消除都执行完毕。感谢所有到目前为止回复的人**
我希望每个id
的值只有一个唯一的code
字段值。
df = pd.DataFrame({'code':['A','A','B','C','D','A']},index=[1,1,1,2,3,3])
df.index.name='id'
字符串
df:
| 代码| code |
| --| ------------ |
| 一个| A |
| 一个| A |
| B| B |
| C类| C |
| D级| D |
| 一个| A |
我想要的输出是:
| 代码| code |
| --| ------------ |
| 一个| A |
| B| B |
| C类| C |
| D级| D |
| 一个| A |
我设法做到这一点如下,* 但我不喜欢它 *。
i=df.index.name
df.reset_index().drop_duplicates().set_index(i)
型
原因如下:
- 如果索引没有名称,则此操作将失败
- 我不需要重新设置和设置索引
- 这是一个相当常见的操作,这里有太多的墨水。
我想说的是:df.groupby('id').drop_duplicates()
个
目前不支持。
有没有一个更Python的方法来做到这一点?
6条答案
按热度按时间rpppsulh1#
要使用
.groupby
有效地删除重复项,只需指定只保留第一行即可:字符串
这个答案是基于this answer的,它还提出了几个额外的替代方案。
7xzttuei2#
当你创建一个
DataFrame
时,将一个列表分配给一个索引,索引的名称将始终是None,一个对象。唯一一次索引的名称将不同的情况是,如果你将一个pd.Series
对象分配给一个索引,其名称与“index"不同。字符串
现在回到您的问题,当您从csv创建DataFrame时,您需要指定一个
index_col
,如果index_col
有一个名称,那么它就是索引名称。在csv中可能没有名称,只有一个空字符串,那么它将没有名称,它将是None
。如果不指定'index_col',将再次没有名称,它将是None
,并且None
不是字符串,它是<class 'NoneType'>
'范例:
型
当您像以前一样创建DataFrame时,或者像我展示的示例一样,您将始终知道索引的名称。
没有索引名的情况下怎么做:
*第一种方法(可能是最好的)
型
与您的类似,因为如果没有名称,.reset_index()方法会将列命名为“index”。还有inplace参数,以防你想修改原始变量df而不是返回副本。
*第二种方法
型
类似地,
.drop()
方法有一个inplace参数,以防你想修改原始的。如果inplace为true,则返回None,否则返回copy,所以在使用inplace参数时不应将返回值赋给任何东西。**注意:**根据需要修改DataFrame后,df.index.name即使原来没有名称,也会有一个名称,为index。如果不需要索引名,可以自由地为索引名分配“无”值。
xuo3flqw3#
要添加到您当前的方法中,请执行以下操作:
1.未命名的索引将转换为
reset_index
后面的列名“index”1.第二步,可以将索引设置为第一列
下面是一个示例:
字符串
nhn9ugyo4#
这是@luzede提供的第一个选项的简短版本:
字符串
请注意,为了简单起见,dataframe是使用“id”作为单独的列来构造的(这产生了与问题中代码片段中基于索引的方法相同的结果)。
fwzugrvs5#
这里有一种方法可以实现结果:
字符串
tpgth1q76#
字符串