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