Я пытаюсь добавить любую строку, где Ans == True
, в отдельный список. Используя ниже, я получаю ошибку типа. В идеале есть более эффективный способ, но мне нужно перебирать строку за строкой.
import pandas as pd
df = pd.DataFrame({
'Code': ['t1', 't2','t3'],
'Ans': [True, False, True],
'Val': [140, 145,140],
})
Trues = []
for row in df.iterrows():
if row['Ans'] == True:
Trues.append(row)
print(Trues)
Вне:
TypeError: tuple indices must be integers or slices, not str
Просто df = df[df["Ans"]]
, чтобы выбрать строки, в которых это правда
@JohnGordon, извини, ошибся с концом
.iterrows()
возвращает кортеж (index, row)
. Попробуйте for index, row in df.iterrows():
. Если вам действительно нужно повторить.
Вы не должны добавлять «строки» в список. .iterrows
перебирает «строки» как pd.Series
объекты, и нет смысла создавать их список. Вам почти наверняка следует просто подстроить свой фрейм данных, используя сам логический столбец:
In [2]: import pandas as pd
In [3]: df = pd.DataFrame({
...: 'Code': ['t1', 't2','t3'],
...: 'Ans': [True, False, True],
...: 'Val': [140, 145,140],
...: })
In [4]: df_true = df[df['Ans']]
In [5]: df_true
Out[5]:
Code Ans Val
0 t1 True 140
2 t3 True 140
Если вам необходим list
, то получите list
из dict
, используя встроенные методы:
In [6]: mylist = df[df['Ans']].to_dict(orient='records')
In [7]: mylist
Out[7]:
[{'Code': 't1', 'Ans': True, 'Val': 140},
{'Code': 't3', 'Ans': True, 'Val': 140}]
Проблема вашего подхода в том, что .iterrows
перебирает пары индексов и строк. Поэтому просто игнорируйте первый элемент пары при итерации, назначая его обычной выбрасываемой переменной _
:
In [8]: [row for _, row in df.iterrows() if row['Ans']]
Out[8]:
[Code t1
Ans True
Val 140
Name: 0, dtype: object,
Code t3
Ans True
Val 140
Name: 2, dtype: object]
Я думаю, вы хотели сказать
if row['Ans'] == True
вместоif df['Ans'] == True
.