Фрейм данных, создающий странную структуру данных

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

Мой код:

 for i, out in zip(foo, output):
    # doing stuff and conditions
    # output = each value in col1
    listA.append([i, out])
listA = pd.DataFrame(listA)
  
                                                          0  1
0        [15921, 10, 82, 22, 202973, 368, 1055, 3135, 1...  0
1        [609, 226, 413, 363, 211, 241, 988, 80, 12, 19...  0
2        [22572, 3720, 233, 13, 827, 710, 512, 354, 1, ...  0
3                             [345, 656, 25, 2589, 6, 866]  0
4                                [29142, 8, 4141, 456, 24]  0
...                                                    ... ..
1599995                         [256, 8, 80, 110, 25, 152]  4
1599996  [609039, 22, 129, 184, 163, 9419, 769, 358, 10...  4
1599997                       [140, 5715, 6540, 294, 1552]  4
1599998  [59, 22771, 189, 387, 4483, 13, 10305, 112231,...  4
1599999                [59, 15833, 200370, 609041, 609042]  4

[1600000 rows x 2 columns]

  

Как вы можете видеть, каждый список имеет свою собственную длину. Я хочу заполнить каждый массив, чтобы достичь len=118 позиций. Есть ли какой-либо способ с DataFrame() помощью аргументов сделать это? Кроме того, он складывается в 1 столбец: я хочу, чтобы каждое значение имело свой собственный столбец (т. Е. Всего 118 столбцов 1 output( col1 ))

Комментарии:

1. вы хотите заполнить эти массивы случайными числами?

2. @sygneto с -1 или NaN , если возможно, но я проверил ваш ответ, и он работает, добавляя после цикла df_new.fillna(-1) . Спасибо!

Ответ №1:

ввод:

  data=[
    [[15921, 10, 82, 22, 202973, 368, 1055, 3135]],[[15921, 10, 82, 22, 202973, 368, 1055, 3135]]
    ]
df=pd.DataFrame(data=data)
print(df)
                                              0
0  [15921, 10, 82, 22, 202973, 368, 1055, 3135]
1  [15921, 10, 82, 22, 202973, 368, 1055, 3135]
  

вывод, из одного столбца в несколько столбцов:

 df_new=pd.DataFrame()

for index,row in df.iterrows():
    a=np.concatenate(row)
    df_new=df_new.append(pd.DataFrame(data=[a]))

print(df_new)

       0   1   2   3       4    5     6     7
0  15921  10  82  22  202973  368  1055  3135
0  15921  10  82  22  202973  368  1055  3135
  

Редактировать:
чтобы сократить время:

 df=df.apply(lambda x : x.explode(),axis=1 )
  

Комментарии:

1. это работает, но мой набор данных содержит 1.600.000 строк, поэтому доступ ко всем из них становится немного медленным. есть ли более быстрое решение?

2. это действительно сработало и быстрее, чем предыдущее решение. Спасибо!!