Как перебрать циклы данных, добавить новые поля в серию, а затем добавить эту серию в CSV? - PullRequest
1 голос
/ 24 июня 2019

Учитывая данные кадра 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.

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

Ответы [ 4 ]

2 голосов
/ 24 июня 2019

Циклы здесь не нужны, только назначьте новый столбец путем сравнения со скаляром и во избежание создания столбцов в оригинале 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
1 голос
/ 24 июня 2019

Также вы можете использовать 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 голос
/ 24 июня 2019

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

import numpy as np
df1 = df.copy()
df1['Senior'] = np.where(df1['Age']>60,True,False)
0 голосов
/ 24 июня 2019

Нашел ответ, который мне был нужен здесь: Преобразование словаря в фрейм данных 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...