Добавление строк в набор данных 100K + - PullRequest
1 голос
/ 11 октября 2019

Я действительно новичок в Python и науке о данных.

У меня есть набор данных 100K + CSV с 30 столбцами. Цель состоит в том, чтобы добавить несколько строк в набор данных, если выполняются некоторые условия.

Чтобы упростить задачу, скажем, у меня есть только три столбца с именами "A", "B" и "C", тип Aи B является целым числом. C - это строка.

Давайте не будем беспокоиться о B и C, так как я собираюсь установить все значения столбца B в 0, а потом вычислю C.

Итак, вот краткий обзор моего«Мнимый» набор данных:

   A
 _____
|  1  |
|  4  |
|  3  |
|  7  |
_______

Я проанализировал свой набор данных в кадре данных и отсортировал его по значению «A».

Итак, теперь это выглядит так:

   A
 _____
|  1  |
|  3  |
|  4  |
|  7  |
_______

Теперь я хочу перебрать свой DataFrame и проверить, не пропустил ли я какое-то число между двумя строками, и добавить их в dataframe, то есть: если A [i + 1] -A [i]> 1, iхочу добавить A [i] +1 между ними.

   A
 _____
|  1  |
|  2  |
|  3  |
|  4  |
|  5  |
|  6  |
|  7  |
_______

Итак, насколько я знаю, у меня есть следующие варианты:

  1. Добавлять мои новые строки непосредственно в новый Dataframe. Я не знаю почему, но я думаю, что это не очень хорошая идея. Если я прав, вы можете объяснить, почему? Если я не прав, вы, ребята, можете объяснить, почему?
  2. Добавьте мои новые строки в Список, создайте DataFrame из этого Списка и "Соедините" мой старый DataFrame с моим новым.
  3. Idk, любойпредложение?

Моя главная проблема сейчас, это то, что работа с большим DataFrame - боль в заднице, и моему сценарию требуются годы, чтобы выполнить эту работу. Ребята, можете ли вы привести меня к «Правильному способу» работы с таким большим количеством данных?

Кстати, вот код, который я сделал для выбора n ° 2:

df=pd.read_csv("dataset.csv")
df.sort_values(by="A")
L=[]
for i in range (0, len(df)-1):
    actual=df.at[i, 'A']
    next=df.at[(i+1), 'A']
    diff=actual-next-1
    for j in range(1, diff):
        L.append(actual+1)
        actual +=1
df=pd.DataFrame(data=L, columns=list(df))
df.to_csv("my_output.csv", sep=',')

Ответы [ 2 ]

3 голосов
/ 11 октября 2019

reindex

Установите 'A' в индекс, а reindex создаст строку для каждого указанного нами значения, выполненного с помощью range. Отсутствуют ячейки для всех остальных столбцов (float и object соответственно). Нет необходимости выполнять сортировку до reindex.

df = pd.DataFrame({'A': [4, 3, 1, 7], 
                   'B': [10, 11, 12, 13], 
                   'C': ['B1', 'B2', 'B3', 'B4'],
                   'D': [True, False, True, True]})

idx = range(df.A.min(), df.A.max()+1)  # All 'A' values you want to represent
df.set_index('A').reindex(idx).reset_index()
#   A     B    C      D
#0  1  12.0   B3   True
#1  2   NaN  NaN    NaN
#2  3  11.0   B2  False
#3  4  10.0   B1   True
#4  5   NaN  NaN    NaN
#5  6   NaN  NaN    NaN
#6  7  13.0   B4   True

Если дублируется 'A', то для достижения того же результата требуется объединение outer.

(df.set_index('A')
   .join(pd.DataFrame(index=pd.Index(idx, name='A')), how='outer')
   .reset_index())
0 голосов
/ 11 октября 2019

Давайте пересоздадим ваш DataFrame и проиндексируем его по A:

rows = [1, 4, 3, 7]
df = pd.DataFrame({"A": rows, "B": [1] * len(rows), "C": ["string"] * len(rows)})
N = df.A.max()
df = df.set_index("A")

Один из вариантов - создать новый DataFrame, заполненный всеми возможными записями для A и нулями в B:

complete_df = pd.DataFrame({"A": range(1, N + 1), "B": [0] * N})
complete_df = complete_df.set_index("A")

Теперь вы можете просто обновить значения в df и удалить индексирование на A:

complete_df = df.combine_first(complete_df)
complete_df = complete_df.reset_index()

Таким образом, вы сохраните все столбцы, поставив нулив столбце B для всех новых строк и NaN во всех остальных столбцах.

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