Как выполнить итерацию и сравнить строку с ручным вводом в фрейме данных pandas?

#python #pandas #visual-studio #dataframe

Вопрос:

У меня есть следующая таблица данных о пандах: введите описание изображения здесь

Приведенное выше изображение-это просто данные, которые я получил от yfinance для фондовых новостей AAPL. Это фрейм данных pandas, содержащий множество дат из другого вызова API, в котором указаны даты для конкретных новостей

У меня есть следующий код:

 df['Boolean'] = df['Open'] < df['Close']
print(df)

if df['Boolean'] == 'False':
    for h in range(0, k):
        if newsdf[h] == df['Date']:
            print('Bearish signal ')
            print(h)
        else:
           print('Signal bullish')
 

Я получаю ошибку: значение истинности ряда неоднозначно. Используйте.empty, a.bool(), a.item(), a.any() или a.all().

Редактировать: Я вижу, что сравниваю все логическое значение, и я не могу этого сделать, но как бы я мог перебрать логический столбец, посмотреть, является ли значение «Истинным» или «Ложным», сравнить значение с newsdf и распечатать этот индекс

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

1. Что k у вас в коде?

2. df['Boolean'] представляет собой целый столбец значений, либо True или False , с некоторыми из них. Вы пытаетесь сравнить весь этот столбец с одной строкой "False" , что никогда не будет правдой. Но вы не можете рассматривать весь столбец как одно значение.

3. @Tuqay k-это len(list1), в основном строка фрейма данных

4. @TimRoberts, значит, мне просто нужен цикл for прямо перед этим?

5. @TimRoberts как бы вы повторили только логический столбец, чтобы проверить, является ли он ложным?

Ответ №1:

попробуйте это, комментарии были помещены против строки кода.

 #package import
import pandas as pd
from io import StringIO

#data setup
newdf=pd.DataFrame({"h":['2021-01-04']})

raw_data= 
'''
Date Open Boolean
2021-01-04 132 False
2021-01-05 120 True
2021-01-06 123 False
'''
df=pd.read_csv(StringIO(raw_data),sep=" ")

#function to have a use case logic
def check_the_signal(df_row,newdf=newdf):
    
    if not df_row['Boolean']: # this is false
        if df_row['Date'] in list(newdf['h']): # caution when newdf is large dataset,list will be large 
            return 'Bearish signal '
        else:
            return 'Signal bullish'
    else:
        return "Neutral" # added for demo only!
df['single']=df.apply(check_the_signal,axis=1)# axis == 1 will send data at row level , saving the value in df, in case needed
 

введите описание изображения здесь

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

1. Эй, спасибо, что ответили. У меня есть несколько вопросов, так что же делает newdf, например, я вижу, что он создает новую колонку с данными 2021-01-04, так что в моем случае, что бы это было, мне трудно понять

2. я получил это из вашего фрагмента кода if newsdf[h] == df['Date'] , поэтому вместо большого фрейма данных я создаю фрейм данных только с одним столбцом, используя словарь {"h":['2021-01-04']} .

3. поэтому мне просто нужно это df=pd.read_csv(StringIO(yahoo.csv),sep=» «) и распечатать(df), чтобы увидеть, что он сделал, и когда я распечатаю его, я не получу таблицу

4. если возможно, сможете ли вы прокомментировать каждую строку lol, а также можете ли вы получить данные от yfinance lol

5. я думаю, что StringIO не работает с csv-файлами?