Мне нужно "изменить" фрейм данных на основе списка в определенном столбце, например (см. Ниже). Мне нужно изменить список в последнем столбце, чтобы иметь только 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, поскольку мой набор данных довольно велик. Есть идеи?
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
Избегайте списков, где это возможно. Вместо этого вы можете создать несколько столбцов:
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
pd.Series
списков не является « pandasian » в первую очередь