相关疑难解决方法(0)

pandas根据其他列的值创建新列

我尝试过与其他问题不同的方法,但似乎仍无法找到问题的正确答案.关键的一点是,如果这个人被算作西班牙裔,他们就不能算作别的了.即使他们在另一个种族栏目中有"1",他们仍被视为西班牙裔,而不是两个或更多种族.同样,如果所有ERI列的总和大于1,则它们被计为两个或更多种族,不能被视为独特的种族(接受西班牙裔).希望这是有道理的.任何帮助将不胜感激.

它几乎就像在每行中执行for循环一样,如果每条记录符合条件,它们将被添加到一个列表中并从原始列表中删除.

从下面的数据框中,我需要根据以下内容计算新列:

========================= CRITERIA ======================== =======

IF [ERI_Hispanic] = 1 THEN RETURN “Hispanic”
ELSE IF SUM([ERI_AmerInd_AKNatv] + [ERI_Asian] + [ERI_Black_Afr.Amer] + [ERI_HI_PacIsl] + [ERI_White]) > 1 THEN RETURN “Two or More”
ELSE IF [ERI_AmerInd_AKNatv] = 1 THEN RETURN “A/I AK Native”
ELSE IF [ERI_Asian] = 1 THEN RETURN “Asian”
ELSE IF [ERI_Black_Afr.Amer] = 1 THEN RETURN “Black/AA”
ELSE IF [ERI_HI_PacIsl] = 1 THEN RETURN “Haw/Pac Isl.”
ELSE IF [ERI_White] = 1 THEN RETURN “White”
Run Code Online (Sandbox Code Playgroud)

评论:如果西班牙裔美国人的ERI标志为真(1),那么员工被归类为"西班牙裔"

评论:如果超过1个非西班牙语ERI标志为真,则返回"两个或更多"

====================== DATAFRAME =========================== …

python numpy apply pandas

251
推荐指数
7
解决办法
37万
查看次数

熊猫:如何对单个列使用apply()函数?

我有一个有两列的pandas数据框.我需要更改第一列的值而不影响第二列,只需更改第一列值即可返回整个数据框.我怎么能用熊猫申请呢?

python dataframe pandas python-3.5

207
推荐指数
7
解决办法
24万
查看次数

从python pandas中的列名获取列索引

在R中,当您需要根据您可以执行的列的名称检索列索引时

idx <- which(names(my_data)==my_colum_name)
Run Code Online (Sandbox Code Playgroud)

有没有办法对pandas数据帧做同样的事情?

python indexing dataframe pandas

168
推荐指数
8
解决办法
22万
查看次数

Pandas:在数据框中创建两个新列,其中的值是根据预先存在的列计算的

我正在使用pandas库,我想在df具有n列(n> 0)的数据帧中添加两个新列.
这些新列是将函数应用于数据框中的一列的结果.

要应用的功能如下:

def calculate(x):
    ...operate...
    return z, y
Run Code Online (Sandbox Code Playgroud)

为仅返回值的函数创建新列的一种方法是:

df['new_col']) = df['column_A'].map(a_function)
Run Code Online (Sandbox Code Playgroud)

所以,我想要的,并尝试不成功(*),是这样的:

(df['new_col_zetas'], df['new_col_ys']) = df['column_A'].map(calculate)
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最佳方法是什么?我没有任何线索扫描文档.

**df['column_A'].map(calculate)返回一个pandas系列,每个项目由一个元组z,y组成.并尝试将其分配给两个dataframe列会产生ValueError.*

python pandas

92
推荐指数
2
解决办法
9万
查看次数

Pandas的性能适用于np.vectorize以从现有列创建新列

我正在使用Pandas数据帧,并希望创建一个新列作为现有列的函数.我还没有看到之间的速度差的一个很好的讨论df.apply()np.vectorize(),所以我想我会问这里.

熊猫apply()功能很慢.根据我的测量结果(如下面的一些实验所示),使用np.vectorize()比使用DataFrame功能快25倍(或更多)apply(),至少在我的2016 MacBook Pro上使用.这是预期的结果,为什么?

例如,假设我有以下带N行的数据框:

N = 10
A_list = np.random.randint(1, 100, N)
B_list = np.random.randint(1, 100, N)
df = pd.DataFrame({'A': A_list, 'B': B_list})
df.head()
#     A   B
# 0  78  50
# 1  23  91
# 2  55  62
# 3  82  64
# 4  99  80
Run Code Online (Sandbox Code Playgroud)

进一步假设我想创建一个新列作为两列的函数AB.在下面的例子中,我将使用一个简单的函数divide().要应用该功能,我可以使用df.apply()np.vectorize():

def divide(a, b):
    if b == 0:
        return …
Run Code Online (Sandbox Code Playgroud)

python arrays performance numpy pandas

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

如何将自定义函数应用于每行的pandas数据框

我想应用自定义函数并创建一个名为population2050的派生列,该列基于我的数据框中已存在的两列.

import pandas as pd
import sqlite3
conn = sqlite3.connect('factbook.db')
query = "select * from facts where area_land =0;"
facts = pd.read_sql_query(query,conn)
print(list(facts.columns.values))

def final_pop(initial_pop,growth_rate):
    final = initial_pop*math.e**(growth_rate*35)
    return(final)

facts['pop2050'] = facts['population','population_growth'].apply(final_pop,axis=1)
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我收到一个错误.我没有正确使用'apply'功能吗?

python pandas

13
推荐指数
4
解决办法
2万
查看次数

Pandas 滚动应用使用多列

我正在尝试pandas.DataFrame.rolling.apply()在多列上使用滚动函数。Python 版本是 3.7,pandas 是 1.0.2。

import pandas as pd

#function to calculate
def masscenter(x):
    print(x); # for debug purposes
    return 0;

#simple DF creation routine
df = pd.DataFrame( [['02:59:47.000282', 87.60, 739],
                    ['03:00:01.042391', 87.51, 10],
                    ['03:00:01.630182', 87.51, 10],
                    ['03:00:01.635150', 88.00, 792],
                    ['03:00:01.914104', 88.00, 10]], 
                   columns=['stamp', 'price','nQty'])
df['stamp'] = pd.to_datetime(df2['stamp'], format='%H:%M:%S.%f')
df.set_index('stamp', inplace=True, drop=True)
Run Code Online (Sandbox Code Playgroud)

'stamp'是单调且唯一的,'price'是双精度'nQty'值且不包含 NaN,是整数且也不包含 NaN。

所以,我需要计算滚动的“质心”,即sum(price*nQty)/sum(nQty)

到目前为止我尝试过的:

df.apply(masscenter, axis = 1)
Run Code Online (Sandbox Code Playgroud)

masscenter 被单行调用 5 次,输出将类似于

price     87.6
nQty     739.0
Name: 1900-01-01 …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas rolling-computation

12
推荐指数
3
解决办法
1万
查看次数

适用于dateframe的Pandas会产生'<内置方法值...'

我正在尝试构建一个GeoJSON对象.我的输入是一个带有地址列,lat列和lon列的csv.然后,我从坐标中创建了Shapely点,用给定的半径缓冲它们,并通过映射选项获得坐标字典 - 到目前为止,非常好.然后,在提到这个问题后,我编写了以下函数来获得一系列字典:

def make_geojson(row): return {'geometry':row['geom'], 'properties':{'address':row['address']}}

我这样应用了它:

data['new_output'] = data.apply(make_geojson, axis=1)
Run Code Online (Sandbox Code Playgroud)

我的结果列充满了以下内容: <built-in method values of dict object at 0x10...

最奇怪的部分是,当我直接调用函数(即make_geojson(data.loc[0])我其实做得到我期待字典.甚至离奇的是,当我打电话,我从得到的功能应用(例如data.output[0](),data.loc[0]['output']())我得到的相当于以下列表: [data.loc[0]['geom'], {'address':data.loc[0]['address']}],即我想要获得的字典的值(但不是键).

对于那些在家里玩的人来说,这是一个玩具示例:

from shapely.geometry import Point, mapping
import pandas as pd

def make_geojson(row):
    return {'geometry':row['geom'], 'properties':{'address':row['address']}}

data = pd.DataFrame([{'address':'BS', 'lat':34.017, 'lon':-117.959}, {'address':'BS2', 'lat':33.989, 'lon':-118.291}])
data['point'] = map(Point, zip(data['lon'], data['lat']))
data['buffer'] = data['point'].apply(lambda x: x.buffer(.1))
data['geom'] = data.buffer.apply(mapping)
data['output'] = data.apply(make_geojson, axis=1)
Run Code Online (Sandbox Code Playgroud)

python apply geojson pandas shapely

9
推荐指数
1
解决办法
1857
查看次数

如何在迭代pandas数据帧时创建新列并插入行值

我正在尝试创建一个逐行迭代pandas数据帧的函数.我想基于其他列的行值创建一个新列.我的原始数据框可能如下所示:

df:

   A   B
0  1   2
1  3   4
2  2   2
Run Code Online (Sandbox Code Playgroud)

现在我想在每个索引位置创建一个填充了列A - 列B的行值的新列,以便结果如下所示:

 df:

       A   B   A-B
    0  1   2   -1
    1  3   4   -1
    2  2   2    0
Run Code Online (Sandbox Code Playgroud)

我工作的解决方案,但只有当我不在函数中使用它时:

for index, row in df.iterrows():
        print index
        df['A-B']=df['A']-df['B']
Run Code Online (Sandbox Code Playgroud)

这给了我想要的输出,但当我尝试将它用作函数时,我收到一个错误.

def test(x):
    for index, row in df.iterrows():
        print index
        df['A-B']=df['A']-df['B']
    return df
df.apply(test)

ValueError: cannot copy sequence with size 4 to array axis with dimension 3
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么,我怎么能让它发挥作用?

python iteration dataframe pandas

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

Pandas 适用于多列输出的滚动

我正在编写一个代码,它将滚动窗口应用于将返回多列的函数。

输入:Pandas Series
预期输出:3 列 DataFrame

def fun1(series, ):
    # Some calculations producing numbers a, b and c
    return {"a": a, "b": b, "c": c} 

res.rolling('21 D').apply(fun1)
Run Code Online (Sandbox Code Playgroud)

资源内容:

time
2019-09-26 16:00:00    0.674969
2019-09-26 16:15:00    0.249569
2019-09-26 16:30:00   -0.529949
2019-09-26 16:45:00   -0.247077
2019-09-26 17:00:00    0.390827
                         ...   
2019-10-17 22:45:00    0.232998
2019-10-17 23:00:00    0.590827
2019-10-17 23:15:00    0.768991
2019-10-17 23:30:00    0.142661
2019-10-17 23:45:00   -0.555284
Length: 1830, dtype: float64
Run Code Online (Sandbox Code Playgroud)

错误:

TypeError: must be real number, not dict
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

  • 在 apply 中更改 raw=True
  • 在 apply 中使用 …

python dataframe pandas rolling-computation

7
推荐指数
1
解决办法
4104
查看次数