python - 拆分值并在熊猫数据框中使用拆分值重命名列
问题描述
所以现在我有一个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
换句话说,我想要的如下:
- 首先将系列拆分为 4,使用分隔符 ' '
- 然后使用分隔符 '=' 进一步拆分新数据框中的所有系列
- 最后形成表格。第一部分 shd 是列名,第二部分 shd 保留为值
我所做的是:
# 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'对象是可变的,因此它们不能被散列
当我也尝试更改列名时
那么问题来了:
- 在这种情况下,如何同时更改列名?
- 我有一种感觉,for循环可以用str函数代替,以使代码更加干净和结构化。有没有其他方法可以做到这一点?
谢谢您的帮助!
解决方案
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("'")
推荐阅读
- matlab - 翻转图表中使用的数据,间隔不变(完全如附图所示)
- mysql - MAMP-Windows 上的 MySQL 服务器无法启动
- c# - 更新凭证文件时,AmazonSQSClient 不刷新 AWSCredentials
- javascript - vue.js 中的库哈希导入不起作用
- sql-server - SQL - 字符串操作
- python - readlines() 在 CSV 文件上使用时不起作用
- nginx - 无法使用 kubernete nginx 入口控制器创建路由规则
- apache-spark - Spark 中的 Join 和 withColumn 异常
- java - 如何使用 Raster 读取 WritableImage 的每个像素?
- c# - 如何在 C# 中通过 socks 代理连接到服务器?