首页 > 解决方案 > 拆分值并在熊猫数据框中使用拆分值重命名列

问题描述

所以现在我有一个csv,数据看起来像这样

 email='abc@cde.com' AID=100200 PID=2500 NID=3950 
 email='def@ghk.com' AID=357156 PID=3544 NID=2688 
 email='testing@edu.uk' AID=385746 PID=6709 NID=2433
 ....

我想把这个系列拆分成一个数据框,最终的表 shd 如下:

     email           AID     PID     NID
   abc@cde.com     100200   2500   3950
   def@ghk.com     357156   3544   2688
   testing@edu.uk  385746   6709   2433

换句话说,我想要的如下:

我所做的是:

# Assume the df as newdf 
import pandas as pd

excel_test = pd.read_csv('filename')
newdf = excel_test.iloc[:,1].str.split(' ', expand=True)

for x in range(1, len(newdf.columns) -1):
    newdf.iloc[:,x] = newdf.iloc[:,x].str.split('=', expand=True)[1]
    new_column_name = newdf.iloc[:,x].str.split('=', expand=True)[0]
    newdf.rename(columns={newdf.columns[x]: new_column_name}, inplace=True)

print(newdf)

在这个脚本中,我得到了值,但是,我得到了一个错误:
TypeError:'Series'对象是可变的,因此它们不能被散列

当我也尝试更改列名时

那么问题来了:

  1. 在这种情况下,如何同时更改列名?
  2. 我有一种感觉,for循环可以用str函数代替,以使代码更加干净和结构化。有没有其他方法可以做到这一点?

谢谢您的帮助!

标签: pythonpandas

解决方案


Idea 正在处理col具有列表和字典理解的列,并通过空格split()和 by=拆分值split('=')

df = pd.read_csv('filename', names=['col'])

print (df)
                                                 col
0   email='abc@cde.com' AID=100200 PID=2500 NID=3950
1   email='def@ghk.com' AID=357156 PID=3544 NID=2688
2  email='testing@edu.uk' AID=385746 PID=6709 NID...


df = pd.DataFrame([dict(y.split('=') for y in x.split()) for x in df['col']])
print (df)
              email     AID   PID   NID
0     'abc@cde.com'  100200  2500  3950
1     'def@ghk.com'  357156  3544  2688
2  'testing@edu.uk'  385746  6709  2433

另一个想法是使用\s+|=分隔符按空格或=首先分割:

df = pd.read_csv('filename', sep="\s+|=", header=None, engine='python')
    
print (df)
       0                 1    2       3    4     5    6     7
0  email     'abc@cde.com'  AID  100200  PID  2500  NID  3950
1  email     'def@ghk.com'  AID  357156  PID  3544  NID  2688
2  email  'testing@edu.uk'  AID  385746  PID  6709  NID  2433

然后通过取消配对第一行选择对列并设置列名:

cols = df.iloc[0, ::2]
df = df.iloc[:, 1::2]
df.columns = cols
print (df)
0             email     AID   PID   NID
0     'abc@cde.com'  100200  2500  3950
1     'def@ghk.com'  357156  3544  2688
2  'testing@edu.uk'  385746  6709  2433

最后提到的@Suhas Mucherla(谢谢)可以''通过以下方式删除Series.str.strip

df['email']=df['email'].str.strip("'")

推荐阅读