Dataframe Pandas
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
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
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
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