Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从另一个csv文件替换一个csv文件的列_Python_Regex_Csv - Fatal编程技术网

Python 从另一个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

我正在做作业,我有两个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.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')