Конкатные столбцы в цикле for

1

У меня есть следующий набор данных:

1   8   15  22
2   9   16  23
3   10  17  24
4   11  18  25
5   12  19  26
6   13  20  27
7   14  21  28

Я хочу получить следующий результат:

1
2
3
4
5
6
7
8
...
23
24
25
26
27
28

Поэтому я хочу перебрать все столбцы моего набора данных и объединить каждый столбец в первый.

import pandas as pd

df = pd.read_csv("data.csv", delimiter=";", header=-1)

number_of_columns= len(df.columns)
print(number_of_columns)


for i in range (1,number_of_columns):
  df1 = df.iloc[:,i]
  df2 = pd.concat([df,df1], ignore_index=True)


print(df2)

При этом только последний столбец конкатенируется в конечном кадре данных. Я получаю, что df2 перезаписывается на каждой итерации цикла for.

Итак, как я могу "сохранить" df2 после каждого цикла for, чтобы каждый столбец был объединен?

Большое спасибо!

  • 1
    Используйте df.unstack()
Теги:
pandas
python-3.x
for-loop
concat

4 ответа

2
Лучший ответ

Для столбцов

stack + tolist

df.stack().tolist()

[1,
 8,
 15,
 22,
 2,
 9,
 16,
 23,
 3,
 10,
 17,
 24,
 4,
 11,
 18,
 25,
 5,
 12,
 19,
 26,
 6,
 13,
 20,
 27,
 7,
 14,
 21,
 28]

Для рядовых

melt

df.melt().value.tolist()

[1,
 2,
 3,
 4,
 5,
 6,
 7,
 8,
 9,
 10,
 11,
 12,
 13,
 14,
 15,
 16,
 17,
 18,
 19,
 20,
 21,
 22,
 23,
 24,
 25,
 26,
 27,
 28]

unstack + tolist

df.unstack().tolist()

#outputs same as above
1

просто np.flatten(),

 pd.Series(df.values.flatten())
 (or)
 pd.Series(df.unstack().values)
1

Возможно, вам не нужна библиотека сторонних разработчиков. Вы можете использовать модули csv и itertools из стандартной библиотеки, чтобы вернуть список чисел:

from io import StringIO
from itertools import chain
import csv

mystr = StringIO("""1   8   15  22
2   9   16  23
3   10  17  24
4   11  18  25
5   12  19  26
6   13  20  27
7   14  21  28""")

with mystr as fin:
    reader = csv.reader(mystr, skipinitialspace=True, delimiter=' ')
    res = list(map(int, chain.from_iterable(zip(*reader))))

print(res)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
 21, 22, 23, 24, 25, 26, 27, 28]
1

Вы также можете это сделать:

txt = '''1   8   15  22
2   9   16  23
3   10  17  24
4   11  18  25
5   12  19  26
6   13  20  27
7   14  21  28'''
arr1 = np.fromstring(txt, dtype=int, sep=' ')
arr1.reshape(7,-1).flatten(order = 'F') # for column wise, 'C' can be used for row wise.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню