如何在数据框架中分割列值

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_indexunstack 最后重命名列和 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()

以上是关于如何在数据框架中分割列值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MVC 框架中分析 SQL 查询?

如何在另一个项目中分离实体框架

如何在带有 Postgres 的动态框架中使用窗口函数中的列值?

用php从mysql列数据中分离值

如何使用 DataTables.net 修复破坏容器外部表格的长列值问题?

如何在 TestNG 单元测试类中分配类级别数据