假设我有一个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) 如何在熊猫中做到这一点:
我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 ...)调用.
我正在使用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.是否有可能实现这一目标,如果是这样,如何实现?
我正在尝试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) 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+2SS(或有关 的其他汇总统计数据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 循环,但它真的很慢。 …