Можно ли разбить pandas фрейм данных на основе значений строк? - PullRequest
2 голосов
/ 13 июля 2020

У меня есть pandas фрейм данных, который фактически содержит несколько разных наборов данных. Между каждым набором данных находится строка, полная NaN. Могу ли я разделить фрейм данных на строку NaN, чтобы сделать два фрейма данных? Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 13 июля 2020

Вы можете использовать это для разделения на множество фреймов данных на основе всех строк NaN:

#index of all NaN rows (+ beginning and end of df)
idx = [0] + df.index[df.isnull().all(1)].tolist() + [df.shape[0]]
#list of data frames split at all NaN indices
list_of_dfs = [df.iloc[idx[n]:idx[n+1]] for n in range(len(idx)-1)]

И если вы хотите исключить строки NaN из разделенных фреймов данных:

idx = [-1] + df.index[df.isnull().all(1)].tolist() + [df.shape[0]]
list_of_dfs = [df.iloc[idx[n]+1:idx[n+1]] for n in range(len(idx)-1)]

Пример:

df:

     0    1
0  1.0  1.0
1  NaN  1.0
2  1.0  NaN
3  NaN  NaN
4  NaN  NaN
5  1.0  1.0
6  1.0  1.0
7  NaN  1.0
8  1.0  NaN
9  1.0  NaN

list_of_dfs:

[     0    1
0  1.0  1.0
1  NaN  1.0
2  1.0  NaN, 

Empty DataFrame
Columns: [0, 1]
Index: [],   

     0    1
5  1.0  1.0
6  1.0  1.0
7  NaN  1.0
8  1.0  NaN
9  1.0  NaN]
0 голосов
/ 13 июля 2020

Мое решение позволяет разбить ваш DataFrame на любое количество фрагментов в каждой строке, заполненной NaN s.

Предположим, что входной DataFrame содержит:

       A    B     C
0   10.0  Abc  20.0
1   11.0  NaN  21.0
2   12.0  Ghi   NaN
3    NaN  NaN   NaN
4    NaN  Hkx  30.0
5   21.0  Jkl  32.0
6   22.0  Mno  33.0
7    NaN  NaN   NaN
8   30.0  Pqr  40.0
9    NaN  Stu   NaN
10  32.0  Vwx  44.0

, чтобы «точки разделения» были строками с индексами 3 и 7 .

Для выполнения вашей задачи:

  1. Создать критерий группировки Ряд :

     grp = (df.isnull().sum(axis=1) == df.shape[1]).cumsum()
    
  2. Отбросить строки, заполненные NaN , и сгруппировать результат по приведенный выше критерий:

     gr = df.dropna(axis=0, thresh=1).groupby(grp)
    

    thresh=1 означает, что для текущей строки достаточно иметь 1 не- NaN значение, которое будет сохранено в результате .

  3. Выполните фактическое разбиение, как понимание списка:

     result = [ gr.get_group(key) for key in gr.groups ]
    

Чтобы распечатать результат, вы можете запустить:

for i, chunk in enumerate(result):
    print(f'Chunk {i}:')
    print(chunk, end='\n\n')

получение:

Chunk 0:
      A    B     C
0  10.0  Abc  20.0
1  11.0  NaN  21.0
2  12.0  Ghi   NaN

Chunk 1:
      A    B     C
4   NaN  Hkx  30.0
5  21.0  Jkl  32.0
6  22.0  Mno  33.0

Chunk 2:
       A    B     C
8   30.0  Pqr  40.0
9    NaN  Stu   NaN
10  32.0  Vwx  44.0
0 голосов
/ 13 июля 2020

Используйте df[df[COLUMN_NAME].isnull()].index.tolist(), чтобы получить список индексов, соответствующих строкам NaN. Затем вы можете разделить фрейм данных на несколько фреймов данных с помощью индексов.

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