Учитывая данные Pandas, такие как:

Name   Age
John   20
Mary   65
Bob    55

Я хочу перебрать строки, решить, является ли каждый человек старшим (возраст> = 60 лет) или нет, создать новую запись с дополнительным столбцом, а затем добавить его в файл CSV, чтобы он (файл CSV) читался как следующим образом :

Name   Age  Senior
John   20   False
Mary   65   True
Bob    55   False

Помимо сохранения данных в CSV, я могу делать все остальное, поворачивая серии, которые цикл в настоящее время повторяет в словарь, затем добавляя новый ключ.

for idx, e in records.iterrows():

        entry = e.to_dict()
        entry["senior"] = (entry["age"]<60)

Простое преобразование dict в серии в dataframe, а не запись его в файл CSV должным образом. Есть ли панда или не-панда способ сделать эту работу?

ВАЖНОЕ РЕДАКТИРОВАНИЕ: Выше приведен упрощенный пример, я имею дело с сотнями строк, и данные, которые я хочу добавить, представляют собой длинную строку , которая будет создана во время выполнения , поэтому зацикливание обязательно. Кроме того, добавить это к исходному фрейму данных нельзя, так как я уверен, что в какой-то момент у меня закончится память программы (поэтому я не могу ни добавить данные в исходный фрейм данных, ни создать новый фрейм данных со всей информацией). Я не хочу добавлять данные в исходный кадр данных, только в копию "строки", которая затем будет добавлена в CSV-файл.

Пример приведен для обеспечения некоторого контекста для моего вопроса, но основное внимание должно быть сосредоточено на вопросе, а не на примере.

1
Mohamad Moustafa 24 Июн 2019 в 13:30

4 ответа

Лучший ответ

Нашел ответ, который мне был нужен здесь: Преобразовать словарь в фрейм данных pandas

Код:

first_entry=True
for idx, e in records.iterrows():

        entry = e.to_dict()
        entry["senior"] = (entry["age"]<60)
        df_entry = pd.DataFrame([entry], columns=entry.keys())

        df_entry.to_csv(output_path, sep=',', index=False, columns=header,header=first_entry,mode='a') 
        #output_path is a variable with path to csv, header is a variable with list of new column names
        first_entry=False

Я надеялся на лучший способ сделать это, но этот работает отлично.

0
Mohamad Moustafa 24 Июн 2019 в 11:26

Также вы можете использовать ge:

df2 = df.copy()
df2['senior'] = df2['Age'].ge(60)

И сейчас:

print(df2)

Выход:

   Name  Age senior
0  John   20  False
1  Mary   65   True
2   Bob   55  False
1
U10-Forward 24 Июн 2019 в 10:33

Циклы здесь не обязательны, только назначайте новый столбец путем сравнения со скаляром и во избежание создания столбцов в оригинальном DataFrame использовании DataFrame.assign - он возвращает новый DataFrame с новым столбцом, и оригинал не изменяется:

df1 = df.assign(senior = df["age"]>=60)

РЕДАКТИРОВАТЬ:

Если действительно нужны петли (не рекомендуется):

for idx, e in df.iterrows():
    df.loc[idx, "senior"] = e["Age"]>=60

print (df)
   Name  Age  senior
0  John   20   False
1  Mary   65    True
2   Bob   55   False
2
jezrael 24 Июн 2019 в 10:39

Используйте np.where

import numpy as np
df1 = df.copy()
df1['Senior'] = np.where(df1['Age']>60,True,False)
1
tawab_shakeel 24 Июн 2019 в 10:37