Не удается заполнить несколько строк в фрейме данных Pandas с помощью метода .iloc()

#python #pandas #dataframe #numpy #datetime

#питон #панды #фрейм данных #тупица #дата и время

Вопрос:

Мне трудно добавлять несколько строк данных в имеющийся у меня набор данных. По какой-то причине, когда я пытаюсь добавить значения, он задает только первую строку, а остальные строки имеют значение NaN.

В качестве заголовка он выводит следующее:

 Time Open Tone 0 1449341520 377.48 0 1 1449341580 377.50 NaN 2 1449341640 377.50 NaN 3 1449341760 377.50 NaN 4 1449341820 377.50 NaN  

Ожидаемый:

 Time Open Tone 0 1449341520 377.48 0 1 1449341580 377.50 0 2 1449341640 377.50 0 3 1449341760 377.50 0 4 1449341820 377.50 0  

btc_data.iloc[:position, -1] = to_btc_data["tone_id"] предполагается, что эти строки должны соответствовать тому, что position есть, но вместо этого он задает только первую строку.

Полный код:

 from pygooglenews import GoogleNews import datetime import time from datetime import timezone from datetime import datetime import json import numpy as np import pandas as pd  gn = GoogleNews()  def create_week_data(ts=1449341520):  df = pd.DataFrame()   search = gn.search('Bitcoin', from_=datetime.fromtimestamp(ts).strftime('%Y-%m-%d'), to_=datetime.fromtimestamp(ts 604800).strftime('%Y-%m-%d'))   titles=[]  dates=[]  timestamps=[]   for item in search["entries"]:  titles.append(item["title"])  dates.append(item["published"])   df["published"] = dates  df["title"] = titles   for item in dates:  month = 1   if (item[8:11] == "Jan"):  month = 1  elif (item[8:11] == "Feb"):  month = 2  elif (item[8:11] == "Mar"):  month = 3  elif (item[8:11] == "Apr"):  month = 4  elif (item[8:11] == "May"):  month = 5  elif (item[8:11] == "Jun"):  month = 6  elif (item[8:11] == "Jul"):  month = 7  elif (item[8:11] == "Aug"):  month = 8  elif (item[8:11] == "Sep"):  month = 9  elif (item[8:11] == "Oct"):  month = 10  elif (item[8:11] == "Nov"):  month = 11  elif (item[8:11] == "Dec"):  month = 12   dt = item[5:7] "/" str(month) "/" item[12:16]   timestamps.append(int(time.mktime(datetime.strptime(dt, "%d/%m/%Y").timetuple())))    df["timestamp"] = timestamps   return df  from ibm_watson import ToneAnalyzerV3 from ibm_cloud_sdk_core.authenticators import IAMAuthenticator  import json  watson_api_key = "KEY" watson_url = "URL"  authenticator = IAMAuthenticator(watson_api_key) tone_analyzer = ToneAnalyzerV3(version='2021-11-27', authenticator=authenticator) tone_analyzer.set_service_url(watson_url)  def to_tone(df = df):  toneData = pd.DataFrame()  tones = []  timestamps = []   for index, row in df.iterrows():  timestamp = row["timestamp"]  title = row["title"]   dump = json.dumps(tone_analyzer.tone(title).get_result())[10:]  tone_id = 0;   if (dump.find("Joy") gt;= 0):  tone_id = 1  elif (dump.find("Anger") gt;= 0):  tone_id = 2  elif (dump.find("Fear") gt;= 0):  tone_id = 3  elif (dump.find("Sadness") gt;= 0):  tone_id = 4  elif (dump.find("Analytical") gt;= 0):  next  elif (dump.find("Confident") gt;= 0):  next  elif (dump.find("Tentative") gt;= 0):  next  else:  tone_id = 0   tones.append(tone_id)  timestamps.append(timestamp)   if (len(tones) gt;= 1):  break   toneData["timestamp"] = timestamps  toneData["tone_id"] = tones    return toneData  print(to_tone())  import numpy as np import pandas as pd  np.set_printoptions(precision=15, suppress=True) btc_data = pd.read_csv(  "/content/drive/MyDrive/Science Fair/output.csv",  names=["Time", "Open"])  btc_data["Tone"] = None  ts = 1449341520 position = 0  while (True):  to_btc_data = pd.DataFrame()   to_btc_data = to_tone(df=create_week_data(ts=ts))   for index, row in btc_data.iterrows():  timestamp = row["Time"]   if (timestamp gt;= ts):  ts = timestamp  position = index  break   btc_data.iloc[:position, -1] = to_btc_data["tone_id"]   ts =604800   print(btc_data.head())   if (ts gt; 1617148800):  btc_data.iloc[ts 604800:] = to_btc_data[0]  break  btc_data.head()  

Какое бы значение ни было в to_btc_data DF, оно должно быть установлено там. Что я здесь делаю не так?

Также прошу прощения за ужасно структурированный код. Я играю над его организацией во время производства, и обычно я не пишу код на Python, поэтому я не буду писать красивый код.

Комментарии:

1. Там , где у вас есть next , вам нужно иметь continue . Это не то next , для чего нужно.

2. len(tones) всегда будет gt;= 1, Вы только что добавили tone_id к немуgt;.

3. Я в курсе. Я, вероятно, удалю часть кода, так как мне действительно не нужны звуковые сигналы, чтобы быть в кадре данных.

4. Вы не увеличиваете свою position переменную внутри while цикла. Независимо от того, сколько раз while выполняется цикл, он всегда установлен на zero .

5. Я исправил это несколько минут назад. Спасибо, что указали на это.