Объект DataFrame не имеет атрибута «имя» - PullRequest
1 голос
/ 20 мая 2019

В настоящее время у меня есть список фреймов данных панд. Я пытаюсь выполнить операцию с каждым элементом списка (то есть с каждым элементом DataFrame, содержащимся в списке), а затем сохранить этот элемент DataFrame в файл CSV.

Я присвоил атрибут name каждому DataFrame, но понял, что в некоторых случаях программа выдает ошибку AttributeError: 'DataFrame' object has no attribute 'name'.

Вот код, который у меня есть.

# raw_og contains the file names for each CSV file.
# df_og is the list containing the DataFrame of each file.
for idx, file in enumerate(raw_og):
    df_og.append(pd.read_csv(os.path.join(data_og_dir, 'raw', file)))
    df_og[idx].name = file

# I'm basically checking if the DataFrame is in reverse-chronological order using the
# check_reverse function. If it is then I simply reverse the order and save the file.
for df in df_og:
    if (check_reverse(df)):
        df = df[::-1]
        df.to_csv(os.path.join(data_og_dir, 'raw_new', df.name), index=False)
    else:
        continue

Программа выдает ошибку во втором цикле for, где я использовал df.name.

Это особенно странно, потому что когда я запускаю print(df.name), он печатает имя файла. Кто-нибудь случайно узнает, что я делаю неправильно?

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 мая 2019

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

создание копии df теряет имя:

df = df[::-1] # creates a copy

установка значения 'keep'исходный объект не поврежден вместе с именем

df.loc[:] = df[:, ::-1] # reversal maintaining the original object

Пример кода, который меняет значения по оси столбца:

df = pd.DataFrame([[6,10]], columns=['a','b'])
df.name='t'
print(df.name)
print(df)
df.iloc[:] = df.iloc[:,::-1]
print(df)
print(df.name)

выводит:

t
   a   b
0  6  10
    a  b
0  10  6
t
1 голос
/ 20 мая 2019

I подозреваю, это обратный процесс, который теряет пользовательский атрибут .name.

In [11]: df = pd.DataFrame()

In [12]: df.name = 'empty'

In [13]: df.name
Out[13]: 'empty'

In [14]: df[::-1].name
AttributeError: 'DataFrame' object has no attribute 'name'

Вам будет лучше хранить набор данных, а не использовать .name:

df_og = {file: pd.read_csv(os.path.join(data_og_dir, 'raw', fn) for fn in raw_og}

Затем вы можете выполнить итерации по этому и обратить значения, которые необходимо изменить ...

for fn, df in df_og.items():
    if (check_reverse(df)):
        df = df[::-1]
        df.to_csv(os.path.join(data_og_dir, 'raw_new', fn), index=False)
...