Получите несколько df из одного df так, чтобы у каждого df не было значений NaN - PullRequest
2 голосов
/ 07 апреля 2020

Я хочу преобразовать эту таблицу

0   thg   John     3.0
1   thg  James     4.0
2   mol    NaN     5.0
3   mol    NaN     NaN
4   lob    NaN     NaN

В следующих таблицах

df1
movie   name  rating
0   thg   John     3.0
1   thg  James     4.0

df2
    movie  rating
2   mol     5.0

df3
    movie
3   mol  
4   lob  

Там, где каждый фрейм данных не имеет значения Nan, также укажите метод, если мне нужно разделить относительно пустое значение вместо Nan.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2020

Я думаю, что запуск нового целевого DataFrame должен происходить не только при изменении значений число из NaN (по сравнению с предыдущей строкой), но и когда это число такое же , но NaN значения находятся в разных столбцах .

Поэтому я предлагаю следующую формулу:

dfs = [g.dropna(how='all',axis=1) for _,g in
    df.groupby(df.isna().ne(df.isna().shift()).any(axis=1).cumsum())]

Вы можете напечатать частичные кадры данных (любые их число) работает:

n = 0
for grp in dfs:
    print(f'\ndf No {n}:\n{grp}')
    n += 1

Преимущество моего решения над другим становится очевидным, когда вы добавляете в исходный DataFrame еще одну строку, содержащую:

5   NaN    NaN    3.0

Она также содержит 1 ненулевое значение (как две предыдущие строки). Другое решение будет обрабатывать все эти строки как один частичный DataFrame, содержащий:

  movie  rating
3   mol     NaN
4   lob     NaN
5   NaN     3.0

, как вы можете видеть, с NaN значениями, тогда как мое решение делит эти строки на 2 отдельных кадра данных, без любой NaN .

2 голосов
/ 07 апреля 2020

создать список DFS, с групповым и дропна:

dfs = [g.dropna(how='all',axis=1) for _,g in df.groupby(df.isna().sum(1))]
print(dfs[0],'\n\n',dfs[1],'\n\n',dfs[2])

Или dict:

d = {f"df{e+1}": g[1].dropna(how='all',axis=1) 
       for e,g in enumerate(df.groupby(df.isna().sum(1)))}
print(d['df1'],'\n\n',d['df2'],'\n\n',d['df3']) #read the keys of d

  movie   name  rating
0   thg   John     3.0
1   thg  James     4.0 

   movie  rating
2   mol     5.0 

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