Повторение серии для создания df в python - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть серия, s

       A   
0     1.5         
1     2.5                  
2     1.3          

Как мне повторить этот столбец 9 раз для создания кадра данных. Ожидаемый результат:

      A             A         ...       A
0     1.5          1.5        ...      1.5         
1     2.5          2.5        ...      2.5                 
2     1.3          1.3        ...      1.3         

df.shape - это (3, 9)

Я могу использовать pd.concat, но это немного грязно. Я попробовал np.repeat, но это не сработало бы axis=1, а axis=0 не то, что мне нужно

Спасибо

Ответы [ 5 ]

0 голосов
/ 03 сентября 2018

Вы можете попробовать:

import pandas as pd
s = pd.Series ({0: 1.5, 1:2.5, 2:1.3}, name='A')
pd.DataFrame(np.tile(s, (10, 1)).T, columns=[f'A{i}' for i in range(10)])

выход

    A0  A1  A2  A3  A4  A5  A6  A7  A8  A9
0   1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
1   2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5
2   1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3
0 голосов
/ 03 сентября 2018

numpy подход: numpy.repeat и numpy.reshape с pandas.DataFrame:

import numpy as np
import pandas as pd

data = np.array(['1.5','2.5','1.3']) # numpy array

s = pd.Series(data) # pandas series

Вариант 1, с использованием numpy.ndarray, numpy.repeat и numpy.reshape:

df = pd.DataFrame(np.repeat(data,9).reshape((3, 9)), columns=['A' for i in range(9)])

Вариант 2, с использованием значений Серии (значения pandas.Series также numpy.ndarray):

df1 = pd.DataFrame(np.repeat(s.values,9).reshape((3, 9)), columns=['A' for i in range(9)])

Вариант 3 с разными именами столбцов:

df2 = pd.DataFrame(np.repeat(s.values,9).reshape((3, 9)), columns=[f'A{i}' for i in range(9)])

Output

Option1:

df:
      A   A   A   A   A   A   A   A   A
0   1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
1   2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5
2   1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3

Вариант 2:

df1:
      A   A   A   A   A   A   A   A   A
0   1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
1   2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5
2   1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3

Вариант 3:

df2:
     A0  A1  A2  A3  A4  A5  A6  A7  A8
0   1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5 1.5
1   2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5
2   1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3 1.3

numpy.repeat

numpy.reshape

0 голосов
/ 03 сентября 2018

Не уверен, что вы имели в виду грязный но pd.concat очень хорошо с этим справляется:

pd.concat([s for i in range(9)], axis=1)

Вы можете пройти

keys=[f'A{i}' for i in range(9)]

до pd.concat, чтобы сделать разные имена столбцов.

0 голосов
/ 03 сентября 2018

упомянутую серию можно создать следующим образом

a = Series ({0: 1.5, 1:2.5, 2:1.3}, name='A')

Чтобы сделать DataFrame с, скажем, 9 повторяющимися столбцами, код будет

b = DataFrame([a]*9).T

.T преобразует DataFrame в желаемую форму.

Поскольку все имена столбцов одинаковы: A в этом случае. Вы можете явно переименовать столбцы с помощью

b.columns = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']

или получите доступ к нужному столбцу с помощью индексатора .iloc следующим образом.

b.iloc[:, 3] = [7.5, 8.5, 9.5]

Это заменит 4-й столбец в DataFrame

0 голосов
/ 03 сентября 2018

Вы можете использовать np.tile и подавать на pd.DataFrame:

res = pd.DataFrame(np.tile(df.values, (1, 10)),
                   columns=[f'A{i:02d}' for i in range(1, 11)])

print(res)

   A01  A02  A03  A04  A05  A06  A07  A08  A09  A10
0  1.5  1.5  1.5  1.5  1.5  1.5  1.5  1.5  1.5  1.5
1  2.5  2.5  2.5  2.5  2.5  2.5  2.5  2.5  2.5  2.5
2  1.3  1.3  1.3  1.3  1.3  1.3  1.3  1.3  1.3  1.3

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

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