如何在熊猫中做到这一点:
我extract_text_features在单个文本列上有一个函数,返回多个输出列.具体来说,该函数返回6个值.
该函数有效,但似乎没有任何正确的返回类型(pandas DataFrame/numpy数组/ Python列表),以便输出可以正确分配 df.ix[: ,10:16] = df.textcol.map(extract_text_features)
所以我认为我需要回到迭代df.iterrows(),按照这个?
更新:迭代df.iterrows()速度至少慢20倍,所以我投降并将函数拆分为六个不同的.map(lambda ...)调用.
是)我有的:
我想做的事:
我已经有以下代码,它可以正常工作.但是,分析表明此代码是我的代码中的重要瓶颈之一,所以我想尽可能优化它,我也有理由相信应该是可能的:
df["NewColumn1"] = df.apply(lambda row: compute_new_column1_value(row), axis=1)
df["NewColumn2"] = df.apply(lambda row: compute_new_column2_value(row), axis=1)
# a few more lines of code like the above
Run Code Online (Sandbox Code Playgroud)
我基于这个答案解决这样的问题这一个(这是与我相似,但具体如何添加一个新列的问题,而我的问题是关于添加了许多新的列).我想这些df.apply()调用中的每一个都是通过所有行的循环在内部实现的,我怀疑应该可以使用只循环所有循环一次的解决方案来优化它(而不是每列需要添加一次) ).
在其他答案中,我看到了对assign()函数的引用,它确实支持一次添加多个列.我尝试以下列方式使用它:
# WARNING: this does NOT work
df = df.assign(
NewColumn1=lambda row: compute_new_column1_value(row),
NewColumn2=lambda row: compute_new_column2_value(row),
# more lines like the two above
)
Run Code Online (Sandbox Code Playgroud)
这不起作用的原因是因为lambda实际上根本没有接收到数据帧的行,它们似乎只是立刻得到整个数据帧.然后期望每个lambda一次返回完整的列/ Series /数组值.所以,我的问题是,我必须最终在这些lambda中通过所有循环实现手动循环,这显然会对性能更糟.
我可以从概念上考虑两种解决方案,但到目前为止还无法找到如何实际实现它们:
类似的东西df.assign()(支持一次添加多个列),但能够将行传递到lambda而不是完整的数据帧
一种向我的compute_new_columnX_value()函数进行向量化的方法,以便它们可以像df.assign()预期的那样用作lambda .
到目前为止我的第二个解决方案的问题是基于行的版本我的一些函数看起来如下,我很难找到如何正确地向量化它们:
def compute_new_column1_value(row):
if row["SomeExistingColumn"] …Run Code Online (Sandbox Code Playgroud) 我有 500,000 个纬度和经度坐标列表,如下所示:
Latitude Longitude
42.022506 -88.168156
41.877445 -87.723846
29.986801 -90.166314
Run Code Online (Sandbox Code Playgroud)
我希望使用 python 来获取新列中每个坐标的城市、州和国家/地区,如下所示:
Latitude Longitude City State Country
42.022506 -88.168156 Streamwood IL United States
41.877445 -87.723846 Chicago IL United States
29.986801 -90.166314 Metairie LA United States
Run Code Online (Sandbox Code Playgroud)
这么大的数据集,如何用Python实现呢?我听说过 Google 的 API、Nominatim 的 API 和 Geopy 包。
我如何才能将所有行运行到这段代码中?现在我必须在最后一行手动输入纬度和经度。
import csv
import pandas as pd
import numpy as np
import math
from geopy.geocoders import Nominatim
input_file = "Lat-Log.csv" # file contains ID, Latitude, Longitude
output_file = "output.csv"
df = pd.read_csv(input_file)
geolocator = …Run Code Online (Sandbox Code Playgroud) 我有一个pandas数据框,我想在上面使用Apply函数根据现有数据生成两个新列。我收到此错误:
ValueError: Wrong number of items passed 2, placement implies 1
import pandas as pd
import numpy as np
def myfunc1(row):
C = row['A'] + 10
D = row['A'] + 50
return [C, D]
df = pd.DataFrame(np.random.randint(0,10,size=(2, 2)), columns=list('AB'))
df['C', 'D'] = df.apply(myfunc1 ,axis=1)
Run Code Online (Sandbox Code Playgroud)
启动DF:
A B
0 6 1
1 8 4
Run Code Online (Sandbox Code Playgroud)
所需DF:
A B C D
0 6 1 16 56
1 8 4 18 58
Run Code Online (Sandbox Code Playgroud)