Изменение формы кадра данных Pandas на основе одного столбца

1

Мне нужно "изменить" фрейм данных на основе списка в определенном столбце, например (см. Ниже). Мне нужно изменить список в последнем столбце, чтобы иметь только k элементов в одной строке. При k = 2

df = 

   c1  c2  c3           c4
  aa   bb  cc  [1,2,3,4,5]  

необходимо прийти:

df_1 = 

  c1   c2   c3     c4
  aa   bb   cc  [1,2]
  aa   bb   cc  [3,4]
  aa   bb   cc    [5]

Конечно, можно реализовать через циклы и добавлять новые кадры данных, но меня интересует более широкий способ применения Pandasian, поскольку мой набор данных довольно велик. Есть идеи?

  • 0
    На самом деле, работа с pd.Series списков не является « pandasian » в первую очередь
  • 0
    @RafaelC, Спасибо за ваш комментарий, но я привел абстрактный пример, чтобы было легче донести проблему, с которой я сталкиваюсь.
Теги:
pandas

2 ответа

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

IIUC

df=df.reindex(df.index.repeat(df.c4.str.len()))# reindex to flatten your dataframe 
df.c4=df.c4.iloc[0]# assign the list value to one column
df
Out[334]:
   c1  c2  c3  c4
0  aa  bb  cc   1
0  aa  bb  cc   2
0  aa  bb  cc   3
0  aa  bb  cc   4
0  aa  bb  cc   5
df['key']=np.arange(len(df))//2# k=2

df.groupby(['c1','c2','c3','key']).c4.agg(lambda x : tuple(x.tolist()))# groupby get the expected output 
Out[352]: 
c1  c2  c3  key
aa  bb  cc  0      (1, 2)
            1      (3, 4)
            2        (5,)
Name: c4, dtype: object
1

Избегайте списков, где это возможно. Вместо этого вы можете создать несколько столбцов:

from itertools import zip_longest

n = 2
A = df.pop('c4').iloc[0]
L = [(i, j) for i, j in zip_longest(A[::2], A[1::2], fillvalue=np.nan)]

res = pd.concat([df]*len(L), ignore_index=True).join(pd.DataFrame(L))

print(res)

   c1  c2  c3  0    1
0  aa  bb  cc  1  2.0
1  aa  bb  cc  3  4.0
2  aa  bb  cc  5  NaN

Ещё вопросы

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