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()
简而言之,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
推荐阅读
- r - 我需要从一个函数中迭代一个 R 平方
- java - 如何在java中使用google drive api分块下载文件?
- post - 如何在继续使用 HttpWebRequest 发布数据的同时检查 HTTP 响应
- java - Criteria Api Vs QueryDsl Vs JPA 元模型
- postgresql - 选择没有价值的记录
- jquery - 复选框字段“重置”功能,更改时取消选中,直到再次选中
- html - 从具有嵌入阴影的文本开始,当我将鼠标悬停在每个字母上时,如何为每个字母进行颜色转换?仅使用 CSS 和 HTML
- java - 如何将 JButton 添加到 JFrame?
- ios - 模拟器中没有 Touch ID / Face ID 提示
- azure - 尝试从 Azure WebJob 写入文件