【问题标题】:How to perform pandas drop_duplicates based on index column如何根据索引列执行pandas drop_duplicates
【发布时间】:2016-12-04 09:01:01
【问题描述】:

当我尝试根据日期时间索引的值对时间序列执行删除复制时,我的头撞到了墙上。

我的功能如下:

def csv_import_merge_T(f):
    dfsT = [pd.read_csv(fp,  index_col=[0], parse_dates=[0], dayfirst=True, names=['datetime','temp','rh'], header=0) for fp in files] 
    dfT = pd.concat(dfsT)
    #print dfT.head(); print dfT.index; print dfT.dtypes
    dfT.drop_duplicates(subset=index, inplace=True)
    dfT.resample('H').bfill()
    return dfT

调用者:

inputcsvT = ['./input_csv/A08_KI_T*.csv']
for csvnameT in inputcsvT:
    files = glob.glob(csvnameT)
    print ('___'); print (files)
    t = csv_import_merge_T(files)
    print csvT

我收到错误提示

NameError: global name 'index' is not defined

怎么了?

更新: 当 csv 输入文件(将被连接)重叠时,似乎会出现此问题。

inputcsvT = ['./input_csv/A08_KI_T*.csv'] 获取文件

A08_KI_T5
28/05/2015 17:00,22.973,24.021
...
2015 年 8 月 10 日 13:30,24.368,45.974

A08_KI_T6
2015 年 8 月 10 日 14:00,24.779,41.526
...
10/02/2016 17:00,22.326,41.83

它运行正确,而:
inputcsvT = ['./input_csv/A08_LR_T*.csv'] 聚集
A08_LR_T5
28/05/2015 17:00,22.493,25.62
...
2015 年 8 月 10 日 13:30,24.296,44.596

A08_LR_T6
28/05/2015 17:00,22.493,25.62
...
10/02/2016 17:15,21.991,38.45
这会导致错误。

【问题讨论】:

  • 实际上你想在这里实现什么?例如,如果您有重复项,是否要修剪重复项的 df?您可以调用 reset_index 并调用 drop_duplicates 传入 index 列名,这将删除重复项
  • 不幸的是,如果我这样做,我会收到错误:KeyError"DatetimeIndex(... ...dtype='datetime64[ns]', name=u'datetime', length=50276, freq=None) not in index"
  • 我下面的建议有用吗?您可能需要确定索引名称,默认为“索引”,但您可能需要先获取名称
  • 你可以试试dfT[~dfT.index.duplicated()]

标签: datetime pandas duplicates time-series


【解决方案1】:

IIUC 你可以打电话给reset_index,然后是drop_duplicates,然后是set_index

In [304]:
df = pd.DataFrame(data=np.random.randn(5,3), index=list('aabcd'))
df

Out[304]:
          0         1         2
a  0.918546 -0.621496 -0.210479
a -1.154838 -2.282168 -0.060182
b  2.512519 -0.771701 -0.328421
c -0.583990 -0.460282  1.294791
d -1.018002  0.826218  0.110252

In [308]:
df.reset_index().drop_duplicates('index').set_index('index')

Out[308]:
              0         1         2
index                              
a      0.918546 -0.621496 -0.210479
b      2.512519 -0.771701 -0.328421
c     -0.583990 -0.460282  1.294791
d     -1.018002  0.826218  0.110252

编辑

其实还有一个更简单的方法是在索引上调用duplicated并反转它:

In [309]:
df[~df.index.duplicated()]

Out[308]:
              0         1         2
index                              
a      0.918546 -0.621496 -0.210479
b      2.512519 -0.771701 -0.328421
c     -0.583990 -0.460282  1.294791
d     -1.018002  0.826218  0.110252

【讨论】:

  • 我试过df.reset_index().drop_duplicates('index').set_index('index'),收到错误"ValueError: cannot reindex a non-unique index with a method or limit"
  • 你没有回答我最后的评论或者df[~df.index.duplicated()]是否为你工作
  • EdChum,谢谢。我确实尝试了dfT[~dfT.index.duplicated()],它返回了与上面相同的错误
  • 那么您的 dfs 存在一些基本问题,我无法重现,因为我的小示例表明这应该可以工作,为了取得进展,您需要发布有代表性的示例数据或链接您的实际数据
  • 我已更新我的问题以包含示例数据,这可能解释了错误发生的原因。
猜你喜欢
  • 2013-10-09
  • 2017-01-09
  • 1970-01-01
  • 2016-10-06
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多