Pandas: разделение кадра данных на несколько кадров данных по количеству строк

довольно новый для pandas, так что несите меня...

У меня огромный csv с множеством таблиц со многими строками. Я хотел бы просто разделить каждый файл данных на 2, если он содержит более 10 строк.

Если true, я бы хотел, чтобы первый dataframe содержал первые 10, а остальные - во втором кадре данных.

Есть ли для этого удобная функция? Я огляделся, но не нашел ничего полезного...

то есть. split_dataframe (df, 2 (if > 10))?

Ответ 1

Это приведет к возврату разделенных DataFrames, если условие выполнено, в противном случае верните оригинал и None (которые вам тогда придется обрабатывать отдельно). Обратите внимание, что это предполагает, что расщепление должно происходить только один раз за df и что вторая часть разделения (если она длиннее 10 строк (это означает, что оригинал был длиннее 20 строк)), это нормально.

df_new1, df_new2 = df[:10, :], df[10:, :] if len(df) > 10 else df, None

Обратите внимание, что вы также можете использовать df.head(10) и df.tail(len(df) - 10), чтобы получить фронт и обратно в соответствии с вашими потребностями. Вы также можете использовать различные подходы к индексированию: вы можете просто предоставить индекс первых измерений, если хотите, например df[:10] вместо df[:10, :] (хотя мне нравится явно указывать размеры, которые вы принимаете). Вы также можете использовать df.iloc и df.ix для индексации аналогичным образом.

Соблюдайте осторожность при использовании df.loc, так как он основан на метках, и вход никогда не будет интерпретироваться как целочисленная позиция. .loc будет работать только "случайно" в случае, если у вас есть индексные метки, которые являются целыми числами начиная с 0 без пробелов.

Но вы также должны рассмотреть различные варианты, которые pandas предусматривает сброс содержимого DataFrame в HTML и, возможно, LaTeX, чтобы лучше создавать таблицы для презентации (а не просто копировать и вставлять). Просто Googling, как преобразовать DataFrame в эти форматы, появляется много учебников и рекомендаций для именно этого приложения.

Ответ 2

Нет специальной функции удобства.

Вам нужно будет сделать что-то вроде:

first_ten = pd.DataFrame()
rest = pd.DataFrame()

if df.shape[0] > 10: # len(df) > 10 would also work
    first_ten = df[:10]
    rest = df[10:]

Ответ 3

Я использовал Список понимания, чтобы разрезать огромный DataFrame на блоки по 100'000:

size = 100000
list_of_dfs = [df.loc[i:i+size-1,:] for i in range(0, len(df),size)]

или как генератор:

list_of_dfs = (df.loc[i:i+size-1,:] for i in range(0, len(df),size))

Ответ 4

Метод, основанный на np.split:

df = pd.DataFrame({    'A':[2,4,6,8,10,2,4,6,8,10],
                       'B':[10,-10,0,20,-10,10,-10,0,20,-10],
                       'C':[4,12,8,0,0,4,12,8,0,0],
                      'D':[9,10,0,1,3,np.nan,np.nan,np.nan,np.nan,np.nan]})

listOfDfs = [df.loc[idx] for idx in np.split(df.index,5)]

Небольшая функция, которая использует модуль, может позаботиться о случаях, когда разделение не является четным (например, np.split(df.index,4) будет вызывать ошибку).

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

Ответ 5

В качестве синтаксического сахара вместо использования slicing/loc вы можете использовать методы head и tail DataFrame. Я использую раздельный размер 3; для вашего примера используйте headSize = 10

def split(df, headSize) :
    hd = df.head(headSize)
    tl = df.tail(len(df)-headSize)
    return hd, tl

df = pd.DataFrame({    'A':[2,4,6,8,10,2,4,6,8,10],
                       'B':[10,-10,0,20,-10,10,-10,0,20,-10],
                       'C':[4,12,8,0,0,4,12,8,0,0],
                      'D':[9,10,0,1,3,np.nan,np.nan,np.nan,np.nan,np.nan]})

# Split dataframe into top 3 rows (first) and the rest (second)
first, second = split(df, 3)

Ответ 6

Ниже приведена простая реализация функции, которая разбивает DataFrame на куски и несколько примеров кода:

import pandas as pd

def split_dataframe_to_chunks(df, n):
    df_len = len(df)
    count = 0
    dfs = []

    while True:
        if count > df_len-1:
            break

        start = count
        count += n
        #print("%s : %s" % (start, count))
        dfs.append(df.iloc[start : count])
    return dfs


# Create a DataFrame with 10 rows
df = pd.DataFrame([i for i in range(10)])

# Split the DataFrame to chunks of maximum size 2
split_df_to_chunks_of_2 = split_dataframe_to_chunks(df, 2)
print([len(i) for i in split_df_to_chunks_of_2])
# prints: [2, 2, 2, 2, 2]

# Split the DataFrame to chunks of maximum size 3
split_df_to_chunks_of_3 = split_dataframe_to_chunks(df, 3)
print([len(i) for i in split_df_to_chunks_of_3])
# prints [3, 3, 3, 1]

Ответ 7

Если у вас есть большой фрейм данных и нужно разделить на переменные числа строк поддиректорий, например, каждый подкадровый фреймворк имеет максимум 4500 строк, этот script может помочь:

max_rows = 4500
dataframes = []
while len(df) > max_rows:
    top = df[:max_rows]
    dataframes.append(top)
    df = df[max_rows:]
else:
    dataframes.append(df)

Затем вы можете сохранить эти кадры данных:

for _, frame in enumerate(dataframes):
    frame.to_csv(str(_)+'.csv', index=False)

Надеюсь, это поможет кому-то!

Ответ 8

Метод, основанный на понимании списка и groupby, который сохраняет все разделенные кадры данных в переменной списка и доступен с помощью индекса.

Пример:

ans = [pd.DataFrame(y) for x, y in DF.groupby('column_name', as_index=False)]***
ans[0]
ans[0].column_name