将用户定义的函数应用于数据框
Posted
技术标签:
【中文标题】将用户定义的函数应用于数据框【英文标题】:applying a user defined function to a dataframe 【发布时间】:2020-10-01 06:23:08 【问题描述】:我尝试编写的函数将采用提供的数据帧并计算 F 统计值并将其作为输出提供。
数据格式Final
Key Color Strength Fabric Sales
a 0 1 1 10
b 1 2 2 15
这里颜色、强度和面料是独立的,而销售是依赖的。
这个想法是创建一个循环,为每个唯一的键值创建一个新的数据框: 并在这个数据帧上执行一个函数,然后创建一个新的数据帧,它是从唯一键值获得的所有新数据帧的连接
def regression():
X=Final1.copy()
y=Final1[['Sales']].copy()
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=.2, random_state=0)
sel=f_classif(X_train, y_train)
p_values=pd.Series(sel[0], index=X_train.columns)
p_values=p_values.reset_index()
pd.options.display.float_format = ":,.2f".format
return p_values
Finals=[]
Finals=pd.DataFrame(Finals)
for group in Final.groupby('Key'):
# group is a tuple where the first value is the Key and the second is the dataframe
Final1=group[1]
Final1=pd.DataFrame(Final1)
result=regression()
Finals=pd.concat([Finals, result], axis=1)
# do xyz with result
print(Finals)
这是我想出的代码,但它抛出了一个错误
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-131-c3a3b53971d5> in <module>
5 Final1=group[1]
6 Final1=pd.DataFrame(Final1)
----> 7 result=regression()
8 Finals=pd.concat([Finals, result], axis=1)
9
<ipython-input-120-d5c718baaba8> in regression()
2 X=Final1.iloc[:,7:-1].copy()
3 y=Final1[['Sale Rate']].copy()
----> 4 X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=.2, random_state=0)
5 sel=f_classif(X_train, y_train)
6 p_values=pd.Series(sel[0], index=X_train.columns)
~\anaconda3\lib\site-packages\sklearn\model_selection\_split.py in train_test_split(*arrays, **options)
2120 n_samples = _num_samples(arrays[0])
2121 n_train, n_test = _validate_shuffle_split(n_samples, test_size, train_size,
-> 2122 default_test_size=0.25)
2123
2124 if shuffle is False:
~\anaconda3\lib\site-packages\sklearn\model_selection\_split.py in _validate_shuffle_split(n_samples, test_size, train_size, default_test_size)
1803 'resulting train set will be empty. Adjust any of the '
1804 'aforementioned parameters.'.format(n_samples, test_size,
-> 1805 train_size)
1806 )
1807
ValueError: With n_samples=1, test_size=0.2 and train_size=None, the resulting train set will be empty. Adjust any of the aforementioned parameters.
这段代码可能出了什么问题?
【问题讨论】:
你能发布完整的回溯吗? 另外你为什么要向agg
传递一个不带任何参数的函数?如果您不对组做任何事情,那么分组就没有多大意义。
我不知道如何传递这个函数,同时以所需的方式对它们进行分组,有没有其他方法可以做到这一点?
我需要在每个组上运行回归
【参考方案1】:
一旦我过滤掉所有观察次数少于 10 的键,代码就可以工作
【讨论】:
【参考方案2】:一个简单的解决方法是:
for group in Final.groupby('Key'):
# group is a tuple where the first value is the Key and the second is the dataframe
result = regression(group[1])
# do xyz with result
编辑:
您不必再次将组转换为数据框,并且可以直接使用它,因为它已经是正确的格式。
# this line is not necessary
Final1 = pd.DataFrame(Final1)
从错误来看,很明显你传入train_test_split函数的group
没有足够的记录。这在错误消息中非常明显。您将不得不使用 try 来处理此类错误,除了。
【讨论】:
编辑了问题中的代码,但仍然抛出错误。 谢谢,它现在可以工作了,我过滤掉了主数据框中少于 10 条记录的所有观察结果,然后运行了 for 循环。以上是关于将用户定义的函数应用于数据框的主要内容,如果未能解决你的问题,请参考以下文章