相关疑难解决方法(0)

将pandas函数应用于列以创建多个新列?

如何在熊猫中做到这一点:

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 ...)调用.

更新2:这个问题是在v0.11.0左右回答的.因此,大部分问题和答案都不太相关.

python merge return-type multiple-columns pandas

181
推荐指数
11
解决办法
12万
查看次数

如何使用依赖于其他列的值有效地向pandas数据框添加多个列

是)我有的:

  • 一个包含许多行的数据帧,以及几个现有列(python,pandas).
  • Python 3.6,所以依赖于特定版本的解决方案对我来说很好(但显然也适用于早期版本的解决方案也很好)

我想做的事:

  • 向数据框添加多个附加列,其中这些新列中的值都取决于同一行中现有列中的值的某些方式.
  • 必须保留数据帧的原始顺序.如果解决方案改变了排序,我可以通过基于其中一个现有列手动排序来恢复它,但显然这会带来额外的开销.

我已经有以下代码,它可以正常工作.但是,分析表明此代码是我的代码中的重要瓶颈之一,所以我想尽可能优化它,我也有理由相信应该是可能的:

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中通过所有循环实现手动循环,这显然会对性能更糟.

我可以从概念上考虑两种解决方案,但到目前为止还无法找到如何实际实现它们:

  1. 类似的东西df.assign()(支持一次添加多个列),但能够将行传递到lambda而不是完整的数据帧

  2. 一种向我的compute_new_columnX_value()函数进行向量化的方法,以便它们可以像df.assign()预期的那样用作lambda .

到目前为止我的第二个解决方案的问题是基于行的版本我的一些函数看起来如下,我很难找到如何正确地向量化它们:

def compute_new_column1_value(row):
    if row["SomeExistingColumn"] …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas

6
推荐指数
1
解决办法
2017
查看次数

如何从纬度和经度坐标列表中获取城市、州和国家/地区?

我有 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)

python latitude-longitude pandas

6
推荐指数
1
解决办法
2万
查看次数

熊猫应用函数返回两个新列

我有一个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)

python python-2.7 pandas

4
推荐指数
3
解决办法
3546
查看次数