Python 从另一个csv文件替换一个csv文件的列
我正在做作业,我有两个CSV文件。第一个文件包含我的全部数据(如下所示) 第一个文件: 第二个文件包含我必须替换为第一个文件的数据Python 从另一个csv文件替换一个csv文件的列,python,regex,csv,Python,Regex,Csv,我正在做作业,我有两个CSV文件。第一个文件包含我的全部数据(如下所示) 第一个文件: 第二个文件包含我必须替换为第一个文件的数据电子邮件列。 我使用正则表达式将第二个文件转换为HTML链接。 这就是我为清理数据所做的: def clean(filename): df = pd.read_csv(filename) df['Email'] = df['Email'].apply(lambda x: x if '@' in str(x) else str(x)+'@myclinic
电子邮件列
。
我使用正则表达式将第二个文件转换为HTML链接。
这就是我为清理数据所做的:
def clean(filename):
df = pd.read_csv(filename)
df['Email'] = df['Email'].apply(lambda x: x if '@' in str(x) else str(x)+'@myclinic.com.au')
return df.to_csv('temp1.csv')
第二个文件输出
电子邮件
这是不正确的。上面的函数是在email列中空格之前输入所有内容,也可以输入email列中@之前有空格的任何行
这就是我要做的:
a) 清除文件1(两个不需要的列)的数据,电子邮件列中有一些空格,因为某些地址的名称中有空格,在最终函数中无法读取。
b) 我得到的最终输出不是我想要的输出。它将显示10行:
这就是我在文件2中所做的
emails = re.findall(r'\S+@\S+', text)
for x in range(0, len(emails)):
emails[x] = '<a href="%s"></a>' % emails[x];
emails.insert(0, 'Email')
with open(csvfile, "w") as output:
writer = csv.writer(output, lineterminator='\n')
for val in emails:
writer.writerow([val])
emails=re.findall(r'\S+@\S+',文本)
对于范围内的x(0,len(电子邮件)):
电子邮件[x]=''%E-mail[x];
电子邮件。插入(0,“电子邮件”)
以open(csvfile,“w”)作为输出:
writer=csv.writer(输出,行终止符='\n')
对于电子邮件中的val:
writer.writerow([val])
在这里,文本是一个包含我全部csv数据的口述。我没有调用CSV文件,而是将整个内容复制到python文件中
最终产量
ID Name郊区州邮政编码Email\u Str Lat Lon
01新南威尔士州赫斯特维尔赫斯特维尔诊所1493-33.975869 151.088939
1 2悉尼中心诊所新南威尔士州悉尼2000-33.867139 151.207114
2 3新南威尔士州奥本市奥本诊所2144-33.849322 151.033421
3 4新南威尔士州Riverwood Riverwood诊所2210-33.949859 151.052469
4.6新南威尔士州哈灵顿市哈灵顿诊所2427-31.872153 152.689811
5.9新南威尔士州贝农诊所贝农2830-32.413736 148.63938
6 11 Preston诊所Preston VIC 3072-37.738736 145.000515
7 13道格拉斯诊所道格拉斯维多利亚3409-37.842988 144.892631
8 14米尔杜拉诊所米尔杜拉维多利亚3500-34.181714 142.163072
9 15布罗德福德诊所维多利亚州布罗德福德3658-37.203001 145.050171
10 16警官诊所警官VIC 3809-38.063056 145.40958
11 18 Langsborough诊所Langsborough VIC 3971-38.651487 146.675098
12 19昆士兰州布里斯班中心诊所布里斯班4000-27.46758 153.027892
13 20罗伯逊诊所昆士兰州罗伯逊4109-27.565733 153.057213
14 22伊普斯威奇诊所伊普斯威奇昆士兰州4305-27.614604 152.760876
昆士兰州卡布尔特诊所卡布尔特4510-27.085007 152.951707
16 25昆士兰州博伊诊所博伊4610-26.498426 151.935421
17 26罗克汉普顿诊所罗克汉普顿昆士兰州4700-23.378941 150.512323
18 28昆士兰州凯恩斯凯恩斯诊所4870-16.925397 145.775178
19 29阿德莱德中心诊所阿德莱德SA 5000-34.92577 138.599732
我的数据在最终合并后丢失
正如你所看到的,它丢失了很多数据。
请帮助我。不确定问题是什么,但似乎您正在尝试将电子邮件文本转换为电子邮件链接。您可以这样做:
df['Email'] = df['Email'].apply(lambda x: '<a href="' + x + '"></a>')
df['Email']=df['Email']。应用(lambda x:“”)
看起来您正在尝试合并“电子邮件”列上的两个数据帧,这样在合并后,您将从DF2
中获得与DF1
合并的电子邮件字符串
- 首先,我们需要在DF2中创建包含电子邮件的第二列 模式匹配DF1(电子邮件地址)
- 接下来,我们在公共电子邮件列上合并DF1和DF2
- 此外,我们删除不需要的列
- 最后,按所需顺序重新排列列
>>> df3
ID Name Suburb State Postcode \
0 1 Hurstville Clinic Hurstville NSW 1493
1 2 Sydney Centre Clinic Sydney NSW 2000
2 3 Auburn Clinic Auburn NSW 2144
3 4 Riverwood Clinic Riverwood NSW 2210
Email_Str Lat Lon
0 <a href="hurstville@myclinic.com.au"></a> -33.975869 151.088939
1 <a href="sydney@myclinic.com.au"></a> -33.867139 151.207114
2 <a href="auburn@myclinic.com.au"></a> -33.849322 151.033421
3 <a href="riverwood@myclinic.com.au"></a> -33.949859 151.052469
>>>
>>df3
身份证名称郊区州邮政编码\
01赫斯特维尔诊所新南威尔士州赫斯特维尔1493
12悉尼中心诊所新南威尔士州悉尼2000
2 3新南威尔士州奥本市奥本诊所2144
3 4新南威尔士州Riverwood Riverwood诊所2210
电子邮件\u Str Lat Lon
0 -33.975869 151.088939
1 -33.867139 151.207114
2 -33.849322 151.033421
3 -33.949859 151.052469
>>>
希望这就是您要找的。我知道问题出在哪里了。 我的原始数据在电子邮件列中有空格。 有人能更新我的正则表达式吗
def clean(filename):
df = pd.read_csv(filename)
df['Email'] = df['Email'].apply(lambda x: x if '@' in str(x) else str(x)+'@myclinic.com.au')
return df.to_csv('temp1.csv')
函数
regex()
将做什么?没有参数,你对潜在的返回值什么也不做。我忘了注释它。这是一个不同的函数调用。这个问题非常不清楚。输出
和文本
来自哪里?您的第二个文件中已包含电子邮件;什么需要改变?第二个文件没有与第一个文件中的行匹配的标识符;您希望如何匹配它们?此外,您似乎遇到了多个问题:您在CSV文件中提到了两个不需要的列,您似乎试图以某种方式清理数据,并且您在匹配方面遇到了问题。将多个问题放在一个问题中会使问题过于宽泛。请在一个问题中只放一个问题,并把每个问题都说清楚。课文是我编的字典。它只包含我的整个CSV文件数据。另外,我在该部分的数据处理上也有问题。我将更新我的问题。@jpmc26我已更新我的问题。请检查。你把df3值存储在哪里了?我看到了。。。但我必须将其存储在CSV文件中。你能帮我怎么做吗?我用df3.to_csv.存储它。。但是现在在final output.csv中,我的数据字段丢失了。我正在更新我的问题。
df['Email'] = df['Email'].apply(lambda x: '<a href="' + x + '"></a>')
import pandas as pd
import re
df1 = pd.read_csv('file1.txt', sep=",", engine="python")
df2 = pd.read_csv('file2.txt', sep=",", engine="python")
def get_email(x):
return ''.join(re.findall(r'"([^"]*)"', x))
df2.columns = ['Email_Str']
df2['Email']=df2['Email_Str'].apply(get_email)
df2 = df2[['Email','Email_Str']]
df3=pd.merge(df1,df2,on='Email').drop(['Email'], axis=1)
df3 = df3[[u'ID', u'Name', u'Suburb', u'State', u'
Postcode',u'Email_Str', u'Lat', u'Lon', ]]
>>> df3
ID Name Suburb State Postcode \
0 1 Hurstville Clinic Hurstville NSW 1493
1 2 Sydney Centre Clinic Sydney NSW 2000
2 3 Auburn Clinic Auburn NSW 2144
3 4 Riverwood Clinic Riverwood NSW 2210
Email_Str Lat Lon
0 <a href="hurstville@myclinic.com.au"></a> -33.975869 151.088939
1 <a href="sydney@myclinic.com.au"></a> -33.867139 151.207114
2 <a href="auburn@myclinic.com.au"></a> -33.849322 151.033421
3 <a href="riverwood@myclinic.com.au"></a> -33.949859 151.052469
>>>
def clean(filename):
df = pd.read_csv(filename)
df['Email'] = df['Email'].apply(lambda x: x if '@' in str(x) else str(x)+'@myclinic.com.au')
return df.to_csv('temp1.csv')