Разделение данных в Python-пандах - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть такой тип dataFrame, который я хотел бы разделить на отдельные кадры данных:

A B C Mark
3 5 6 T
4 5 2 T
3 4 5 B
5 6 7 B
3 4 5 T
2 5 2 T

Например, приведенная выше таблица должна быть разделена на три кадра данных pandas.Первый кадр данных с двумя пометками «T» является одним кадром данных, второй кадр данных с двумя последующими строками с пометкой «B» и третий кадр данных с двумя последними строками с пометкой «T».

df1

A B C Mark
3 5 6 T
4 5 2 T

df2

 A B C Mark
   3 4 5 B
   5 6 7 B

df3

A B C Mark
3 4 5 T
2 5 2 T

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Создайте словарь, как показано ниже:

frames = {}
for i, grp in df.groupby(df.Mark.ne(df.Mark.shift()).cumsum()):
    frames.update([('df_'+str(i),grp)])

{'df_1':    A  B  C Mark
 0  3  5  6    T
 1  4  5  2    T, 'df_2':    A  B  C Mark
 2  3  4  5    B
 3  5  6  7    B, 'df_3':    A  B  C Mark
 4  3  4  5    T
 5  2  5  2    T}

Затем вы можете проверить, напечатав все dfs как:

print(frames['df_1'])

   A  B  C Mark
0  3  5  6    T
1  4  5  2    T
0 голосов
/ 14 февраля 2019

Другой способ обернуть это в np.array_split для данного поста: однако, np.array_split возвращает список фреймов данных, следовательно, вы можете перечислить его вниз и даже перебрать список.

Результат:

>>> np.array_split(df, 3)
[   A  B  C Mark
0  3  5  6    T
1  4  5  2    T,    A  B  C Mark
2  3  4  5    B
3  5  6  7    B,    A  B  C Mark
4  3  4  5    T
5  2  5  2    T]

Перечисление их как отдельных dfs:

>>> df[0]
   A  B  C Mark
0  3  5  6    T
1  4  5  2    T

>>> df[1]
   A  B  C Mark
2  3  4  5    B
3  5  6  7    B

>>> df[2]
   A  B  C Mark
4  3  4  5    T
5  2  5  2    T

Или вы можете назначить им имена:

df1 = df[0]
df2 = df[1]
df2 = df[2]
0 голосов
/ 14 февраля 2019

Создать словарь DataFrames с последовательным счетчиком shift и cumsum с преобразованием объекта groupby в кортежи, а затем в словарь:

dfs = dict(tuple(df.groupby(df['Mark'].ne(df['Mark'].shift()).cumsum())))
print (dfs)
{1:    A  B  C Mark
0  3  5  6    T
1  4  5  2    T, 2:    A  B  C Mark
2  3  4  5    B
3  5  6  7    B, 3:    A  B  C Mark
4  3  4  5    T
5  2  5  2    T}

Выберите каждый DataFrame:

print (dfs[1])
print (dfs[2])
print (dfs[3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...