我有一个函数,可以产生一年中每个月的结果。在我的数据框中,我收集了不同数据列的这些结果。在那之后,我有一个数据框,其中包含多个具有数组作为值的列。现在,我想“透视”这些列以使每个值都在其自己的列中。 例如,如果某行在“ A”列中包含值[1,2,3,4,5,6,7,8,9,10,11,12],我想拥有十二个列“ A_01”,“ A_02',...,'A_12'每个都包含一个数组中的值。
我当前的代码是这样:
# create new columns
columns_to_add = []
column_count = len(columns_to_process)
for _, row in df[columns_to_process].iterrows():
columns_to_add += [[row[name][offset] if type(row[name]) == list else row[name]
for offset in range(array_len) for name in range(column_count)]]
new_df = pd.DataFrame(columns_to_add,
columns=[name+'_'+str(offset+1) for offset in range(array_len)
for name in columns_to_process],
index=df.index) # make dataframe addendum
(注意:有些行没有任何值,因此我必须将条件if type() == list
放入迭代中)
但是这段代码非常慢。我相信必须有一个更加优雅的解决方案。你能告诉我这样的解决方案吗?
答案 0 :(得分:1)
IIUC,将Series.tolist
与pandas.DataFrame
构造函数一起使用。
我们还将使用DataFrame.rename
来修复您的列名格式。
# Setup
df = pd.DataFrame({'A': [ [1,2,3,4,5,6,7,8,9,10,11,12] ]})
pd.DataFrame(df['A'].tolist()).rename(columns=lambda x: f'A_{x+1:0>2d}')
[出]
A_01 A_02 A_03 A_04 A_05 A_06 A_07 A_08 A_09 A_10 A_11 A_12
0 1 2 3 4 5 6 7 8 9 10 11 12