我试图获取两个 pandas 数据表的相同元素,对数据进行索引并将其合并。我将它用于大量数据(数百万)。第一个表 (df) 是恒定的,第二个表 (d2) 在每个循环中都在变化,新元素将与第一个表合并。
这是我的此过程的代码:
df = pd.read_csv("inputfile.csv",header=None)
d1 = pd.DataFrame(df).set_index(0)
for i in range(0, len(df)):
try:
follower_id=twitter.get_followers_ids(user_id=df.iloc[i][0],cursor=next_cursor)
f=follower_id['ids']
json.dumps(f)
d2 = pd.DataFrame(f).set_index(0)
match_result = pd.merge(d1,d2,left_index=True,right_index=True)
fk=[df.iloc[i][0] for number in range(len(match_result))]
DF = pd.DataFrame(fk)
DF.to_csv(r'output1.csv',header=None,sep=' ',index=None)
match_result.to_csv(r'output2.csv', header=None, sep=' ')
我经历过,这段代码运行良好一段时间,但之后 - 可能与每个循环都会更改的第二个数据库大小有关 - 程序给我以下错误消息,并停止运行:
Traceback (most recent call last):
File "halozat3.py", line 39, in <module>
d2 = pd.DataFrame(f).set_index(0) #1Trump koveto kovetolistaja
File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 2372, in set_index
level = frame[col].values
File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 1678, in __getitem__
return self._getitem_column(key)
File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 1685, in _getitem_column
return self._get_item_cache(key)
File "/usr/lib/python2.7/dist-packages/pandas/core/generic.py", line 1052, in _get_item_cache
values = self._data.get(item)
File "/usr/lib/python2.7/dist-packages/pandas/core/internals.py", line 2565, in get
loc = self.items.get_loc(item)
File "/usr/lib/python2.7/dist-packages/pandas/core/index.py", line 1181, in get_loc
return self._engine.get_loc(_values_from_object(key))
File "index.pyx", line 129, in pandas.index.IndexEngine.get_loc (pandas/index.c:3656)
File "index.pyx", line 149, in pandas.index.IndexEngine.get_loc (pandas/index.c:3534)
File "hashtable.pyx", line 381, in pandas.hashtable.Int64HashTable.get_item (pandas/hashtable.c:7035)
File "hashtable.pyx", line 387, in pandas.hashtable.Int64HashTable.get_item (pandas/hashtable.c:6976)
KeyError: 0
可能是什么问题?
代码中的错误是由于在某些情况下尝试将 DataFrame 设置为不是 DataFrame 中实际值之一的值的索引而导致的。具体来说,当
f
为空列表时,就会发生这种情况,这意味着
follower_id['ids']
不返回任何值。
可以通过检查
f
在设置索引之前是否为空来解决此错误,如下所示:
df = pd.read_csv("inputfile.csv",header=None)
d1 = pd.DataFrame(df).set_index(0)
for i in range(0, len(df)):
try:
follower_id=twitter.get_followers_ids(user_id=df.iloc[i][0],cursor=next_cursor)
f=follower_id['ids']
json.dumps(f)
# 如果 f 不为空,则检查 DataFrame 是否为空
if f:
d2 = pd.DataFrame(f).set_index(0)
match_result = pd.merge(d1,d2,left_index=True,right_index=True)
fk=[df.iloc[i][0] for number in range(len(match_result))]
DF = pd.DataFrame(fk)
DF.to_csv(r'output1.csv',header=None,sep=' ',index=None)
match_result.to_csv(r'output2.csv', header=None, sep=' ')
# 否则,跳过迭代
else:
continue
except Exception as e:
print(f"Iteration {i}: {e}")
continue
此代码将在尝试设置索引之前检查
f
列表是否为空。如果为空,则代码将跳过该迭代并继续执行循环中的下一次迭代。这可以防止
KeyError
的发生,并使的代码能够更可靠地运行。
此外,添加一个
try-except
块来捕获循环期间可能发生的任何异常是一个好习惯。这将帮助识别代码中可能出现的任何其他问题,并防止它在出现错误时崩溃。