如何在数据框架中分割列值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在数据框架中分割列值相关的知识,希望对你有一定的参考价值。
我有一个这样的数据框架
PK Name Mobile questions
1 Jack 12345 [{'question':"how are you","Response":"Fine"},{"question":"whats your age","Response":"i am 19"}]
2 kim 102345 [{'question':"how are you","Response":"Not Fine"},{"question":"whats your age","Response":"i am 29"}]
3 jame 420
我希望输出的df是这样的
PK Name Mobile Question 1 Response 1 Question 2 Response 2
1 Jack 12345 How are you Fine Whats your age i am 19
2 Kim 102345 How are you Not Fine Whats your age i am 29
3 jame 420
答案
您可以使用 explode
来先在每个列表中每个元素创建一行。然后从这个爆炸的系列中创建一个数据框架,并保留索引。assign
一列来获取每行每索引组的增量值,然后 set_index
和 unstack
最后重命名列和 join
归原配
# create a row per element in each list in each row
s = df['questions'].explode()
# create the dataframe and reshape
df_qr = pd.DataFrame(s.tolist(), index=s.index)
.assign(cc=lambda x: x.groupby(level=0).cumcount()+1)
.set_index('cc', append=True).unstack()
#flatten columns names
df_qr.columns = [f'{col[0]} {col[1]}' for col in df_qr.columns]
# join back to df
df_f = df.drop('questions', axis=1).join(df_qr, how='left')
print (df_f)
PK Name Mobile question 1 question 2 Response 1 Response 2
0 1 Jack 12345 how are you whats your age Fine i am 19
1 2 kim 102345 how are you whats your age Not Fine i am 29
编辑,如果有些行是emppty字符串而不是lis,那么就可以创建 s
这样一来。
s = df.loc[df['questions'].apply(lambda x: isinstance(x, list)), 'questions'].explode()
以上是关于如何在数据框架中分割列值的主要内容,如果未能解决你的问题,请参考以下文章
如何在带有 Postgres 的动态框架中使用窗口函数中的列值?