python-函数适用于数据帧的每一行,但不使用df.apply

我有这个熊猫数据框,每行包含两个样本X和Y:

import pandas as pd
import numpy as np
df = pd.DataFrame({'X': [np.random.normal(0, 1, 10),
                         np.random.normal(0, 1, 10),
                         np.random.normal(0, 1, 10)],
                   'Y': [np.random.normal(0, 1, 10),
                         np.random.normal(0, 1, 10),
                         np.random.normal(0, 1, 10)]})

我想在每行上使用函数ttest_ind()(以两个样本作为输入的统计测试),并采用响应的第一个元素(该函数返回两个元素):

>如果我针对给定的行执行此操作,例如第一行,它的工作原理:

from scipy import stats
stats.ttest_ind(df['X'][0], df['Y'][0], equal_var = False)[0]
# Returns a float

>但是,如果我使用apply在每一行上执行此操作,则会收到错误消息:

df.apply(lambda x: stats.ttest_ind(x['X'], x['Y'], equal_var = False)[0])

# Throws the following error:
Traceback (most recent call last):
File "pandas\_libs\index.pyx", line 154, in 
pandas._libs.index.IndexEngine.get_loc
File "pandas\_libs\hashtable_class_helper.pxi", line 759, in 
pandas._libs.hashtable.Int64HashTable.get_item
TypeError: an integer is required
During handling of the above exception, another exception occurred:
...
KeyError: ('X', 'occurred at index X')

我究竟做错了什么?

解决方法:

您只需要指定要在其上应用功能的轴即可.看一下与apply()相关的docs.简而言之,axis = 1表示“将函数应用于数据框的每一行”.默认值为axis = 0,它将尝试将功能应用于每列.

df.apply(lambda x: stats.ttest_ind(x['X'], x['Y'], equal_var = False)[0], axis=1)

0    0.985997
1   -0.197396
2    0.034277
上一篇:python-对非均匀一维信号进行下采样


下一篇:scipy和numpy sobel梯度计算之间的差异