Dataframe Pandas

Oct 31 2020

Eu tenho um dataframe que contém um número de colunas e linhas, em todas as colunas, exceto para as duas mais à esquerda, há dados do formato "inteiro-inteiro". Eu gostaria de dividir todas essas colunas em duas colunas, com cada número inteiro em sua própria célula, e remover o traço.

Tentei seguir as respostas no Dataframe do Pandas: Divida várias colunas, cada uma em duas colunas , mas parece que elas estão se dividindo após um elemento, enquanto eu gostaria de dividir no "-".

A título de exemplo, suponha que eu tenha um dataframe do formulário:

Eu gostaria de dividir as colunas rotuladas de 2 a 22, para que sejam chamadas de 2F, 2A, 3F, 3A, ..., 6A com os dados na primeira linha sendo R1, Hawthorn, 229, 225, 91, 81, ..., 12.

Obrigado por qualquer ajuda.

Respostas

2 jezrael Oct 31 2020 at 13:48

Você pode usar DataFrame.set_indexcom DataFrame.stackpara Series, depois dividir em novas 2 colunas por Series.str.split, converter para inteiros, criar novos nomes de colunas por DataFrame.set_axis, remodelar por DataFrame.unstack, classificar colunas por DataFrame.sort_indexe por último nivelar MultiIndexcom converter índice em colunas por DataFrame.reset_index:

#first replace columns names to default values
df.columns = range(len(df.columns))

df = (df.set_index([0,1])
        .stack()
        .str.split('-', expand=True)
        .astype(int)
        .set_axis(['F','A'], axis=1, inplace=False)
        .unstack()
        .sort_index(axis=1, level=[1,0], ascending=[True, False]))
df.columns = df.columns.map(lambda x: f'{x[1]}{x[0]}')
df = df.reset_index()
print (df)
    0                1   2F   2A   3F   3A   4F   4A   5F   5A  6F  6A
0  R1         Hawthorn  229  225   91   81  216  142  439  367   7  12
1  R2           Sydney  226  214   93   92  151  167  377  381  12   8
2  R3          Geelong  216  228   91  166  159  121  369  349  16  14
3  R4  North Melbourne  213  239  169  126  142  155  355  394   8   9
4  R5       Gold Coast  248  226  166   94  267  169  455  389  18   6
5  R6         St Kilda  242  197  118  161  158  156  466  353  15  16
6  R7        Fremantle  225  219   72   84  224  185  449  464   7   5
sharathnatraj Oct 31 2020 at 14:19

Para entrada:

df = pd.DataFrame({0: ['R1'], 1: ['Hawthorn'], 2: ['229-225'],  3: ['91-81'], 4:['210-142'], 5:['439-367'], 6:['7-12']})

    0         1        2      3        4        5     6
0  R1  Hawthorn  229-225  91-81  210-142  439-367  7-12

Experimentando o código:

for i in df.columns[2::]:
    df[[str(i)+'F', str(i)+'A']] =pd.DataFrame(df[i].str.split('-').tolist(), index= df.index)
    del df[i] 

Impressões (1ª linha):

    0         1   2F   2A  3F  3A   4F   4A   5F   5A 6F  6A
0  R1  Hawthorn  229  225  91  81  210  142  439  367  7  12
CodePerfectPlus Oct 31 2020 at 14:46

você pode usar a função lambda para dividir uma série

import pandas as pd

df = pd.read_csv("data.csv")
df.head()
>>> data
0  12-24
1  13-26
2  14-28
3  15-30
df["d1"] = df["data"].apply(lambda x: x.split("-")[0])
df["d2"] = df["data"].apply(lambda x: x.split("-")[1])
df.head()
>>>
    data  d1  d2
0  12-24  12  24
1  13-26  13  26
2  14-28  14  28
3  15-30  15  30