TypeError: объект 'int' не может быть повторен при переборе столбца панд - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть простой случай использования.Я хочу прочитать текстовый файл в файл pandas и перебрать уникальные id s, чтобы построить график xy .У меня отлично получалось во многих других проектах, но теперь я получаю TypeError: 'int' object is not iterable.Сначала я получил TypeError: 'numpy.float64' object is not iterable, поэтому я изменил тип id на int (см. Код).Но это тоже не работает.Я не понимаю, почему.Есть идеи?

f = open(file,"r+")
with open(file,"r+") as f1:
    data10 = f1.read()
    TESTDATA = StringIO(data11)
df = pd.read_table(TESTDATA, sep=" ")
df.columns = ["x", "y", "id"]

#Astype because i got the error TypeError: 'numpy.float64' object is not iterable
df.id = df.id.astype(int)

#get unique values of column id
list1=df['id'].tolist()
list1=list(set(list1))
fig, ax = plt.subplots()
for i ,g in list1:
    x = df[df.id==i]['x']
    y = df[df.id==i]['y']
    g.plot(x='x',y='x', marker='o', ax=ax, title="Evaluation")

1 Ответ

0 голосов
/ 24 сентября 2018

ИМХО, ваш код уменьшается до

df = pd.read_table(file, sep=" ")

fig, ax = plt.subplots()
grpd = df.groupby('id')
for i, g in grpd:
    g.plot(x='x',y='y', marker='o', ax=ax, title="Evaluation")

Объяснение:
Я шаг за шагом расскажу код:

f = open(file,"r+")

можно удалить вам не нужно открывать файл перед тем, как открывать его в with -блоке
Но , если вы открываете его таким образом, не забудьте закрыть после того, как он вам больше не нужен.

with open(file,"r+") as f1:
    data10 = f1.read()
    TESTDATA = StringIO(data11)

можно удалить
1. странное использование данных10,data11 (это не будет работать) и StringIO (слишком сложный)
2. см. следующую строку кода

df = pd.read_table(file, sep=" ") 

OK , если вы замените TESTDATA просто на file, pandas очень мощен при импорте файлов разных вкусов ...

df.columns = ["x", "y", "id"]

OK , если у вашего файла уже нет собственного заголовка, который бы соответствовал вашим потребностям, что я 'рекомендую проверить, возможно ...

#Astype because i got the error TypeError: 'numpy.float64' object is not iterable
df.id = df.id.astype(int)

можно удалить , поскольку ваша ошибка не имеет к этому никакого отношения, как я уже говорил в своем комментарии вчера

#get unique values of column id
list1=df['id'].tolist()
list1=list(set(list1))

можно удалить если вам нужны уникальные значения столбца в пандах, используйте df['id'].unique(), но вам не нужно делать все вручную здесь, поскольку для цели, которую вы хотите достичь, есть groupby:

grpd = df.groupby('id')  

Возвращает объект groupby, который действительно предоставляет вам групповые данные и групповых данных при итерации по нему, поэтому ваш цикл с двумя переменными будет работать здесь:

fig, ax = plt.subplots()
for i, g in grpd:
    g.plot(x='x',y='x', marker='o', ax=ax, title="Evaluation")

и чтобы быть завершенным: ваши дополнительные

x = df[df.id==i]['x']
y = df[df.id==i]['y']

также могут быть удалены , потому что это также входит в идею группировки.(И, кстати, вы даже не использовали его в своем коде ...)

В конце Я бы порекомендовал вам прочитать самые основы Python и панд, особенно файлio https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files и группировка панд https://pandas.pydata.org/pandas-docs/stable/groupby.html

...