有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`
答案 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
功能更容易