删除pandas

时间:2015-07-29 03:38:31

标签: python-2.7 pandas

背景

有5个DataFrame,我称之为b1, b2, b3, b4, b5

它们的数据结构由列['Date', 'Value']

组成

我从2014年到2015年获得了数据。

问题

每个DataFrame都有不同的日期计数系统。所以,我想摆脱DataFrames中具有不匹配日期的行。

我该怎么做?

我尝试了什么

因此,如果数据Date未包含在所有数据框中,我将删除所有数据:b1, b2, b3, b4, b5

这是第一次使用

for i in range(len(b2.index)):
    k = 0
    for j in range(len(b1.index)):
        if b2['Date'][i] == b1['Date'][j]:
            k = k+1
        else:
            k = k
    if k == 1:
        pass
    if k == 0:
        b2 = b2.drop([i])

但是,之后我在执行此操作后再次执行此代码,会出现这样的错误:

  

KeyError Traceback(最近一次调用最后一次)    in()   2k = 0   3为范围内的j(len(b2.index)):   ----> 4如果b1 ['日期'] [i] == b2 ['日期'] [j]:   5 k = k + 1   6其他:

      getitem 中的

C:\ Users \ cms \ Anaconda \ lib \ site-packages \ pandas \ core \ series.pyc(self,key)      519def getitem (自我,关键):      520尝试:    - > 521 result = self.index.get_value(self,key)      522      523如果不是np.isscalar(结果):

     get_value中的

C:\ Users \ cms \ Anaconda \ lib \ site-packages \ pandas \ core \ index.pyc(self,series,key)     1593     1594尝试:    - > 1595返回self._engine.get_value(s,k)     1596除了KeyError为e1之外:     1597如果len(自我)> 0和self.inferred_type在['整数',' boolean']中:

     

pandas \ index.pyx在pandas.index.IndexEngine.get_value(pandas \ index.c:3113)()

     pandas.index.IndexEngine.get_value中的pandas \ index.pyx(pandas \ index.c:2844)()

     

pandas \ index.pyx在pandas.index.IndexEngine.get_loc(pandas \ index.c:3704)()

     pandas.hashtable.Int64HashTable.get_item中的pandas \ hashtable.pyx(pandas \ hashtable.c:7224)()

     pandas.hashtable.Int64HashTable.get_item中的pandas \ hashtable.pyx(pandas \ hashtable.c:7162)()

     

KeyError:28L

我想做的是

mlist = (b1,b2,b3,b4,b5)
for q in mlist:
    for r in mlist:
        for i in range(len(q.index)):
            k = 0
            for j in range(len(r.index)):
                if q['Date'][i] == r['Date'][j]:
                    k = k+1
                else:
                    k = k
            if k == 1:
                pass
            if k == 0:
                q = q.drop([i])`enter code here`

3 个答案:

答案 0 :(得分:0)

这个怎么样?使用set.intersecton()

s = set(b1.index)
for b in [b2,b3,b4,b5]:
    s=s.intersection(set(b.index))
for b in [b1,b2,b3,b4,b5]:
    b=b.drop(b.index[-b.index.isin(s)],inplace=True)

答案 1 :(得分:0)

您希望保留所有数据集中的日期。

这可以通过使用MSDN对所有这些内部联接执行内部联接来轻松完成。

b = b1.merge(on='Date', right=b2, how='inner', suffixes=['', '_b2'])
b = b.merge(on='Date', right=b3, how='inner', suffixes=['', '_b3'])
b = b.merge(on='Date', right=b4, how='inner', suffixes=['', '_b4'])
b = b.merge(on='Date', right=b5, how='inner', suffixes=['_b1', '_b5'])

我在这里对您的数据做了一些假设,因为您还没有发布任何示例数据。

如果我的数据有任何问题,请告诉我,我会更正我的例子。

示例:

b1 = pd.DataFrame({'Date':pd.date_range('2015-05-05', '2015-05-10'), 'Value':range(1,7)})
        Date  Value
0 2015-05-05      1
1 2015-05-06      2
2 2015-05-07      3
3 2015-05-08      4
4 2015-05-09      5
5 2015-05-10      6

b2 = pd.DataFrame({'Date':pd.date_range('2015-05-07', '2015-05-12'), 'Value':range(4,10)})
        Date  Value
0 2015-05-05      1
1 2015-05-06      2
2 2015-05-07      3
3 2015-05-08      4
4 2015-05-09      5
5 2015-05-10      6

b = b1.merge(on='Date', right=b2, how='inner', suffixes=['_b1', '_b2'])
        Date  Value_b1  Value_b2
0 2015-05-07         3         4
1 2015-05-08         4         5
2 2015-05-09         5         6
3 2015-05-10         6         7

答案 2 :(得分:0)

this posting您可以看到答案

print(nameof(myVar) + " value is " + myVar.toString());

我相信你的代码失败的原因是因为你没有在删除后重置索引。我想如果您想手动执行此操作,您可以先执行索引存储,然后立即删除所有内容

merged_mlist = reduce(lambda left,right: pandas.merge(left,right,on='Date', how='inner'), mlist)

更好的是,如果您仍想实现for循环

inds_to_drop = []
for i in range(len(b2)):
    for j in range(len(b1)):
        if b2['Date'][i] != b1['Date'][j]:
            inds_to_drop.append(i)
b2.drop( b2.index[inds_to_drop], inplace=True)    
b2.reset_index( drop=True,inplace=True) # this may or may not be necessary, havent thought all the way through

您可以为每次迭代执行此操作..虽然运行与reduce

配对的pandas.merge功能更容易