首页 > 解决方案 > 如何在带有标题的jupyter笔记本中将单行转换为四个不同的列?

问题描述

我有一个单行的excel文件。我导入了 jupyter notebook,我试图在 jupyter notebook 中使用 pandas 在这一行中创建四列。例如行:

姓名:查尔斯

电子邮件:char@gmail.com

密钥:10223209asd

摘要:这是一个例子

名称:大脑

电子邮件:bria@gmail.com

密钥:10390weq09asd

摘要:这是一个例子

我希望列是这样的,每行都有信息。

4 列:名称电子邮件密钥摘要

第一行:姓名:charles 电子邮件:char@gmail.com 密钥:10223209asd 摘要:这是一个..

我还有第二个文件。如何取两行并将它们分成带有标题的两列。

电子邮件:steven@gmail.com

信息:这是电子邮件的示例。这比一个句子长。

电子邮件:chris@gmail.com

信息:这是电子邮件的示例。这比一个句子长。

我希望这些列是这样的,其中包含 2 列电子邮件和信息中的信息。

标签: stringpandasparsingjupyter-notebookrows

解决方案


reshapeDataFrame构造函数一起使用:

print (df)
                           col
0                name: charles
1        email: char@gmail.com
2             key: 10223209asd
3  summary: this is an example
4                  name: brain
5        email: bria@gmail.com
6           key: 10390weq09asd
7  summary: this is an example

cols = ['name','email','key','summary']
df1 = pd.DataFrame(df['col'].values.reshape(-1, 4), columns=cols)
print (df1)
            name                  email                 key  \
0  name: charles  email: char@gmail.com    key: 10223209asd   
1    name: brain  email: bria@gmail.com  key: 10390weq09asd   

                       summary  
0  summary: this is an example  
1  summary: this is an example  

如果要删除之前的值:

cols = ['name','email','key','summary']
df2 = pd.DataFrame(df['col'].str.split(':\s+').str[1].values.reshape(-1, 4), columns=cols)
print (df2)
      name           email            key             summary
0  charles  char@gmail.com    10223209asd  this is an example
1    brain  bria@gmail.com  10390weq09asd  this is an example

一般解决方案是DataFrame由创建str.split,然后计算重复次数cumcount,最后一次整形unstack

df2 = df['col'].str.split(':\s+', expand=True)
df2.columns = ['key','val']

df2 = df2.set_index([df2.groupby('key').cumcount(), 'key'])['val'].unstack()
print (df2)
key           email            key     name             summary
0    char@gmail.com    10223209asd  charles  this is an example
1    bria@gmail.com  10390weq09asd    brain  this is an example

推荐阅读