我正在使用pandas来组合一些csv文件。
我需要根据其中一行创建多个新列,在本例中为network。目前我已经可以看到一堆适用于创建列,这会损害性能,有没有一种方法可以创建多个列只需一个应用,或者更高效的方式来实现相同的结果?< / p>
dataReader = pd.read_csv('file.csv', usecols=['geoname_id' , 'country_iso_code','country_name','subdivision_1_name','subdivision_2_name','city_name','time_zone'])
rangeReader = pd.read_csv('file2.csv', chunksize = size, usecols=['geoname_id','network'])
start_time = time.time()
output = open("result.csv" , 'w')
#removes countries we dont care about
dataReader = dataReader[(dataReader.country_iso_code.isin(countries))]
addHeader = True
for chunk in rangeReader:
print("Loop ",i,"took %s seconds" % (time.time() - start_time))
chunk = pd.merge(chunk, dataReader, on="geoname_id", how="inner")
chunk['low_ip'] = chunk.apply(lambda row: getLowIp(row), axis=1)
chunk['high_ip'] = chunk.apply(lambda row: getHighIp(row), axis=1)
chunk['low_ip_int']= chunk.apply(lambda row: getIpInt(row['low_ip']), axis=1)
chunk['high_ip_int']= chunk.apply(lambda row: getIpInt(row['high_ip']), axis=1)
chunk['json'] = chunk.apply(lambda row: toElasticJson(row), axis=1)
chunk.to_csv(output, header=addHeader, sep='|')
addHeader = False
答案 0 :(得分:0)
经过一番挖掘,我发现了
lambda应返回pd.Series(),如
return pd.Series((low , high, int(IPAddress(low)) , int(IPAddress(high))))
,分配将是
chunk[['low_ip' , 'high_ip' , 'low_ip_int', 'high_ip_int']] = chunk.apply(lambda row: getAllIpFields(row['network']), axis=1)
这种方式我加入所有适用于一个,节省了一些性能。