Tengo un marco de datos con dos columnas, necesito separar estas dos columnas (columna A y B) por N Filas secuenciales (por ejemplo, 100 filas). Entonces, la salida será de 100 filas en la columna A y B, otras 100 filas en la columna C y D, ... ¿Hay alguna función específica que pueda lidiar con este propósito?

-1
Wei Zhang 8 jun. 2021 a las 23:21

2 respuestas

La mejor respuesta

Suponiendo que n siempre divide uniformemente la longitud del marco, vsplit + hstack es una opción:

n = 5
new_df = pd.DataFrame(np.hstack(np.vsplit(df.values, len(df) // n)))
new_df.columns = new_df.columns.map(lambda c: chr(c + ord('A')))

Ejemplo completo de trabajo:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A': np.arange(1, 16),
                   'B': np.arange(101, 116)})

n = 5
new_df = pd.DataFrame(np.hstack(np.vsplit(df.values, len(df) // n)))
new_df.columns = new_df.columns.map(lambda c: chr(c + ord('A')))
print(new_df)
     A    B
0    1  101
1    2  102
2    3  103
3    4  104
4    5  105
5    6  106
6    7  107
7    8  108
8    9  109
9   10  110
10  11  111
11  12  112
12  13  113
13  14  114
14  15  115

new_df:

   A    B   C    D   E    F
0  1  101   6  106  11  111
1  2  102   7  107  12  112
2  3  103   8  108  13  113
3  4  104   9  109  14  114
4  5  105  10  110  15  115
0
Henry Ecker 8 jun. 2021 a las 20:54

Los datos de entrada:

df = pd.DataFrame(np.arange(1, 2001).reshape((-1, 2)), columns=["A", "B"])
print(df)

        A     B
0       1     2
1       3     4
2       5     6
3       7     8
4       9    10
..    ...   ...
995  1991  1992
996  1993  1994
997  1995  1996
998  1997  1998
999  1999  2000

[1000 rows x 2 columns]

Utilice np.array_split

out = np.concatenate(np.array_split(df, range(100, len(df), 100)), axis=1)
print(out)

array([[   1,    2,  201, ..., 1602, 1801, 1802],
       [   3,    4,  203, ..., 1604, 1803, 1804],
       [   5,    6,  205, ..., 1606, 1805, 1806],
       ...,
       [ 195,  196,  395, ..., 1796, 1995, 1996],
       [ 197,  198,  397, ..., 1798, 1997, 1998],
       [ 199,  200,  399, ..., 1800, 1999, 2000]])

Construye tu flujo de datos:

df1 = pd.DataFrame(out, columns=list(map(chr, range(65, out.shape[1]+65))))
print(df1)

      A    B    C    D    E    F  ...     O     P     Q     R     S     T
0     1    2  201  202  401  402  ...  1401  1402  1601  1602  1801  1802
1     3    4  203  204  403  404  ...  1403  1404  1603  1604  1803  1804
2     5    6  205  206  405  406  ...  1405  1406  1605  1606  1805  1806
3     7    8  207  208  407  408  ...  1407  1408  1607  1608  1807  1808
4     9   10  209  210  409  410  ...  1409  1410  1609  1610  1809  1810
..  ...  ...  ...  ...  ...  ...  ...   ...   ...   ...   ...   ...   ...
95  191  192  391  392  591  592  ...  1591  1592  1791  1792  1991  1992
96  193  194  393  394  593  594  ...  1593  1594  1793  1794  1993  1994
97  195  196  395  396  595  596  ...  1595  1596  1795  1796  1995  1996
98  197  198  397  398  597  598  ...  1597  1598  1797  1798  1997  1998
99  199  200  399  400  599  600  ...  1599  1600  1799  1800  1999  2000

[100 rows x 20 columns]
1
Corralien 8 jun. 2021 a las 20:50