Этот ответ использует метод DataFrame.filter для этого без понимания списка:
import pandas as pd
data = {'spike-2': [1,2,3], 'hey spke': [4,5,6]}
df = pd.DataFrame(data)
print(df.filter(like='spike').columns)
Будет выводить только «spike-2». Вы также можете использовать регулярное выражение, как некоторые люди предложили в комментариях выше:
print(df.filter(regex='spike|spke').columns)
Выведет обе колонки: ['spike-2', 'hey spke']
Вам нужна маска:
# Set a default value
data['rwasted'] = data['republican'] - data['votestowin']
# Find where it is different
mask = data['democrat'] >= data['republican']
# Set those rows to another value
data['rwasted'][mask] = data['republican']
Нет необходимости в операторе if-else, нет для цикла, также необходимо. Вы должны думать по строкам и столбцам с DataFrames, а не по ячейкам.
.all()
- это функция, которая применяется ко всему Series
, а не к одному row
. Вы смешиваете понятия здесь. Чтобы сделать построчное сравнение (как вы хотите):
myseries = []
for idx, row in data.iterrows():
if row['democrat'] >= row['republican']:
myseries.append(row['republican'])
else:
myseries.append(row['republican'] - row['votestowin'])
data['rwasted'] = pd.Series(myseries)
См. Ответ @ 9769953 для более краткого способа применения его в кадре данных, но это аналог вашего 114] подход