Python 熊猫:将多个DataFrame.apply组合成一个

Python 熊猫:将多个DataFrame.apply组合成一个,python,pandas,dataframe,apply,Python,Pandas,Dataframe,Apply,我使用熊猫组合一些csv文件 我需要基于其中一行(在本例中为“网络”)创建多个新列。目前我有很多应用程序来创建列,这会影响性能,有没有一种方法可以用一个应用程序创建多个列,或者有没有一种更有效的方法来实现相同的结果 dataReader = pd.read_csv('file.csv', usecols=['geoname_id' , 'country_iso_code','country_name','subdivision_1_name','subdivision_2_name','city

我使用熊猫组合一些csv文件

我需要基于其中一行(在本例中为“网络”)创建多个新列。目前我有很多应用程序来创建列,这会影响性能,有没有一种方法可以用一个应用程序创建多个列,或者有没有一种更有效的方法来实现相同的结果

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

经过一番挖掘,我发现了

lambda应该返回一个pd.Series()函数,如

而任务是

chunk[['low_ip' , 'high_ip' , 'low_ip_int', 'high_ip_int']] = chunk.apply(lambda row: getAllIpFields(row['network']), axis=1)

通过这种方式,我将所有应用程序合并为一个,节省了一些性能。

请给出输入和输出示例。您认为这会导致性能问题是正确的,但我们没有测试用例。
chunk[['low_ip' , 'high_ip' , 'low_ip_int', 'high_ip_int']] = chunk.apply(lambda row: getAllIpFields(row['network']), axis=1)