相关疑难解决方法(0)

如何将函数应用于两列Pandas数据帧

假设我有一个df'ID', 'col_1', 'col_2'.我定义了一个函数:

f = lambda x, y : my_function_expression.

现在我想应用fto df的两列'col_1', 'col_2'来逐元素地计算一个新列'col_3',有点像:

df['col_3'] = df[['col_1','col_2']].apply(f)  
# Pandas gives : TypeError: ('<lambda>() takes exactly 2 arguments (1 given)'
Run Code Online (Sandbox Code Playgroud)

怎么做 ?

** 添加详细示例如下 ***

import pandas as pd

df = pd.DataFrame({'ID':['1','2','3'], 'col_1': [0,2,3], 'col_2':[1,4,5]})
mylist = ['a','b','c','d','e','f']

def get_sublist(sta,end):
    return mylist[sta:end+1]

#df['col_3'] = df[['col_1','col_2']].apply(get_sublist,axis=1)
# expect above to output df as below 

  ID  col_1  col_2            col_3
0  1      0 …
Run Code Online (Sandbox Code Playgroud)

python dataframe pandas

289
推荐指数
13
解决办法
37万
查看次数

将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.rolling_apply返回两个值

我正在使用pandas.rolling_apply将数据拟合到分布并从中获取值,但我需要它还报告滚动的拟合优度(特别是p值).目前我这样做:

def func(sample):
    fit = genextreme.fit(sample)
    return genextreme.isf(0.9, *fit)

def p_value(sample):
    fit = genextreme.fit(sample)
    return kstest(sample, 'genextreme', fit)[1]

values = pd.rolling_apply(data, 30, func)
p_values = pd.rolling_apply(data, 30, p_value)
results = pd.DataFrame({'values': values, 'p_value': p_values})
Run Code Online (Sandbox Code Playgroud)

问题是我有很多数据,而且拟合函数很昂贵,所以我不想为每个样本调用两次.我宁愿做的是这样的事情:

def func(sample):
    fit = genextreme.fit(sample)
    value = genextreme.isf(0.9, *fit)
    p_value = kstest(sample, 'genextreme', fit)[1]
    return {'value': value, 'p_value': p_value}

results = pd.rolling_apply(data, 30, func)
Run Code Online (Sandbox Code Playgroud)

结果是DataFrame两列的结果.如果我试图运行它,我得到一个例外: TypeError: a float is required.是否有可能实现这一目标,如果是这样,如何实现?

python pandas

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

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万
查看次数

Pandas - 在多列上使用 `.rolling()`

DataFrame考虑一只看起来像下面的熊猫

      A     B     C
0  0.63  1.12  1.73
1  2.20 -2.16 -0.13
2  0.97 -0.68  1.09
3 -0.78 -1.22  0.96
4 -0.06 -0.02  2.18
Run Code Online (Sandbox Code Playgroud)

我想使用该函数.rolling()执行以下计算t = 0,1,2

  • t选择从到 的行t+2
  • 从所有列中获取这 3 行中包含的 9 个值。调用此设置S
  • 计算 的第 75 个百分位S(或有关 的其他汇总统计数据S


例如,t = 1我们有 S = { 2.2 , -2.16, -0.13, 0.97, -0.68, 1.09, -0.78, -1.22, 0.96 } 并且第 75 个百分位数是 0.97。

我找不到让它与 一起工作的方法.rolling(),因为它显然单独使用每一列。我现在依靠 for 循环,但它真的很慢。 …

python dataframe pandas rolling-computation

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