Python 2.7 删除熊猫中所有数据帧中不存在的行 背景
有5个数据帧,我将它们称为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
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)
wheremlist=(b1,b2,b3,b4,b5)
你能帮我吗?如果你给我你的电子邮件什么的,我会给你我的数据。实际上,下面的代码运行得很好,但是,它返回“空”数据帧,不知道为什么。@SeongNohYoon为什么不写下尝试此解决方案时出现的错误,而不是向三个不同的人请求电子邮件支持?有什么不好的地方?这部分代码可能有输入错误。。我编辑了它。。坏索引应该是inds\u-to\u-drop
。。但我真的认为你应该试试