Python 2.7 删除熊猫中所有数据帧中不存在的行 背景

Python 2.7 删除熊猫中所有数据帧中不存在的行 背景,python-2.7,pandas,Python 2.7,Pandas,有5个数据帧,我将它们称为b1、b2、b3、b4、b5 它们具有由列组成的数据结构['Date','Value'] 我得到了2014年到2015年的数据 问题 每个数据帧都有不同的日期计数系统。所以,我想去掉数据帧中日期不匹配的行 我该怎么做 我试过的 因此,如果数据的Date未包含在所有数据帧中,我将删除所有数据:b1、b2、b3、b4、b5 这是第一次奏效 for i in range(len(b2.index)): k = 0 for j in range(len(b1.i

有5个数据帧,我将它们称为
b1、b2、b3、b4、b5

它们具有由列组成的数据结构
['Date','Value']

我得到了2014年到2015年的数据

问题 每个数据帧都有不同的日期计数系统。所以,我想去掉数据帧中日期不匹配的行

我该怎么做

我试过的 因此,如果数据的
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回溯(最近一次呼叫最后一次) 在() 2k=0 3对于范围内的j(len(b2.索引)): ---->4如果b1['Date'][i]==b2['Date'][j]: 5K=k+1 6其他:

C:\Users\cms\Anaconda\lib\site packages\pandas\core\series.pyc ingetitem(self,key) 519defgetitem(自身,键): 520试试: -->521结果=self.index.get_值(self,key) 522 523如果不是np.isscalar(结果):

C:\Users\cms\Anaconda\lib\site packages\pandas\core\index.pyc in get_value(self、series、key) 1593 1594尝试: ->1595返回自引擎。获取值(s,k) 1596除键错误为e1外: 1597如果len(self)>0且self.u键入['integer','boolean']:

pandas.index.IndexEngine.get_值中的pandas\index.pyx(pandas\index.c:3113)()

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

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

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

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

键错误: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`

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


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


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

这可以很容易地通过使用对所有对象执行内部联接来完成

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

如果我对你的数据有任何错误,请让我知道,我会纠正我的例子

例如:

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

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

这可以很容易地通过使用对所有对象执行内部联接来完成

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

如果我对你的数据有任何错误,请让我知道,我会纠正我的例子

例如:

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
从中你可以看到答案

merged_mlist = reduce(lambda left,right: pandas.merge(left,right,on='Date', how='inner'), mlist)
我相信您的代码失败的原因是因为您在删除后没有重置索引。我认为,如果你想手动操作,你可以先存储索引,然后一次删除所有索引

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
更好的是,如果您仍然想要实现for循环

inds_to_drop = [ i for i,dt in enumerate(b2.Date) if not pandas.np.where( b1.Date==dt)[0].size ] 
您可以为每个迭代执行此操作。。虽然与中的

一起运行该函数更容易,但您可以看到答案

merged_mlist = reduce(lambda left,right: pandas.merge(left,right,on='Date', how='inner'), mlist)
我相信您的代码失败的原因是因为您在删除后没有重置索引。我认为,如果你想手动操作,你可以先存储索引,然后一次删除所有索引

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
更好的是,如果您仍然想要实现for循环

inds_to_drop = [ i for i,dt in enumerate(b2.Date) if not pandas.np.where( b1.Date==dt)[0].size ] 


您可以为每个迭代执行此操作。。虽然与

一起运行该函数比较容易,但它可以正常工作,但是,我希望使每个索引都有相同的索引。例如,b1、b2、b3、b4、b5需要在索引#5中有2014-07-30,在#6中有2014-07-31。您能提供示例输入和所需输出吗?您能帮助我吗?如果你给我你的电子邮件什么的,我会给你我的数据。实际上,下面的代码运行得很好,但是,它返回“空”数据帧,不知道为什么。@SeongNohYoon为什么不写下尝试此解决方案时出现的错误,而不是向三个不同的人请求电子邮件支持?这有点行得通,但是,我想让每个索引都有相同的索引。例如,b1、b2、b3、b4、b5需要在索引#5中有2014-07-30,在#6中有2014-07-31。您能提供示例输入和所需输出吗?您能帮助我吗?如果你给我你的电子邮件什么的,我会给你我的数据。实际上,下面的代码运行得很好,但是,它返回“空”数据帧,不知道为什么。@SeongNohYoon为什么不写下尝试此解决方案时出现的错误,而不是向三个不同的人请求电子邮件支持?你能帮我吗?如果你给我你的电子邮件什么的,我会给你我的数据。实际上,下面的代码运行得很好,但是,它返回“空”数据帧,不知道为什么。@SeongNohYoon为什么不写下尝试此解决方案时出现的错误,而不是向三个不同的人请求电子邮件支持?有什么不好的地方?这部分代码可能有输入错误。。我编辑了它。。坏索引应该是
inds\u-to\u-drop
。。但我真的认为你应该试试第一部分:
reduce(lambda left,right:pandas.merge(left,right,on='Date',how='inner'),mlist)
where
mlist=(b1,b2,b3,b4,b5)
你能帮我吗?如果你给我你的电子邮件什么的,我会给你我的数据。实际上,下面的代码运行得很好,但是,它返回“空”数据帧,不知道为什么。@SeongNohYoon为什么不写下尝试此解决方案时出现的错误,而不是向三个不同的人请求电子邮件支持?有什么不好的地方?这部分代码可能有输入错误。。我编辑了它。。坏索引应该是
inds\u-to\u-drop
。。但我真的认为你应该试试