Как разделить кадр данных pandas разных размеров столбцов на отдельные кадры данных? - PullRequest
1 голос
/ 13 октября 2019

У меня есть большой массив данных pandas, состоящий из разного количества столбцов в кадре данных. Вот пример: Пример текущего фрейма данных

Я хотел бы разбить фрейм данных на несколько фреймов, основываясь на количестве столбцов, которые у него есть.

Пример выходного изображения здесь: Выходное изображение

Спасибо.

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Если я вас правильно понял, вам нужно разделить существующий 1 фрейм данных с n столбцами на ceil(n/5) фреймов данных, каждый с 5 столбцами, а последний с напоминанием n/5.

Если это так, то сработает:

import pandas as pd
import math

max_cols=5

dt={"a": [1,2,3], "b": [6,5,3], "c": [8,4,2], "d": [8,4,0], "e": [1,9,5], "f": [9,7,9]}

df=pd.DataFrame(data=dt)

dfs=[df[df.columns[max_cols*i:max_cols*i+max_cols]] for i in range(math.ceil(len(df.columns)/max_cols))]

for el in dfs:
    print(el)

И вывод:

   a  b  c  d  e
0  1  6  8  8  1                                            
1  2  5  4  4  9                                            
2  3  3  2  0  5                                               
   f                                                        
0  9                                                        
1  7                                                        
2  9                                                        

[Program finished]
1 голос
/ 13 октября 2019

Если у вас есть фрейм данных, скажем, 10 столбцов, и вы хотите поместить записи со значениями 3 NaN в другой результирующий фрейм данных, как те, которые имеют 1 NaN, вы можете сделать это следующим образом:

# evaluate the number of NaNs per row
num_counts=df.isna().sum('columns')
# group by this number and add the grouped
# dataframe to a dictionary
results= dict()
num_counts=df.isna().sum('columns')
for key, sub_df in df.groupby(num_counts):
    results[key]= sub_df

После выполнения этого кода результаты содержат подмножества df, где каждое подмножество содержит одинаковое количество NaN с (то есть такое же количество не- NaN с).

Если вы хотитечтобы записать результаты в файл Excel, вам нужно просто выполнить следующий код:

with pd.ExcelWriter('sorted_output.xlsx') as writer:
    for key, sub_df in results.items():
        # if you want to avoid the detour of using dicitonaries
        # just replace the previous line by
        # for key, sub_df in df.groupby(num_counts):
        sub_df.to_excel(
            writer,
            sheet_name=f'missing {key}',
            na_rep='',
            inf_rep='inf',
            float_format=None,
            index=True,
            index_label=True,
            header=True)

Пример:

# create an example dataframe
df=pd.DataFrame(dict(a=[1, 2, 3, 4, 5, 6], b=list('abbcac')))
df.loc[[2, 4, 5], 'c']= list('xyz')
df.loc[[2, 3, 4], 'd']= list('vxw')
df.loc[[1, 2], 'e']= list('qw')

Это выглядит так:

Out[58]: 
   a  b    c    d    e
0  1  a  NaN  NaN  NaN
1  2  b  NaN  NaN    q
2  3  b    x    v    w
3  4  c  NaN    x  NaN
4  5  a    y    w  NaN
5  6  c    z  NaN  NaN

Если вы выполнили приведенный выше код для этого фрейма данных, вы получите словарь со следующим содержанием:

0:    a  b  c  d  e
   2  3  b  x  v  w

1:    a  b  c  d    e
   4  5  a  y  w  NaN

2:    a  b    c    d    e
   1  2  b  NaN  NaN    q
   3  4  c  NaN    x  NaN
   5  6  c    z  NaN  NaN

3:    a  b    c    d    e
   0  1  a  NaN  NaN  NaN

Ключами словаря являются число NaN s в строке и значения:кадры данных, которые содержат только строки с таким числом NaN с.

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