python - 将一个 DataFrame 中的列用作 MultiIndex 以在另一个 DataFrame 中进行 t-test
问题描述
使用 Pandas 将一个 DataFrame 中的列用作另一个 MultiIndexed DataFrame 的索引来运行 t 检验的最佳实践是什么?
我已经看到了其他几个类似的问题,这些问题涉及在这里循环,它们似乎并不理想。
例如,我想对以下指定的组inds
与不在DataFrameinds
中的组进行 t 检验。dat
import numpy as np
import pandas as pd
from scipy.stats import ttest_ind
np.random.seed(999)
dat = pd.DataFrame(data={"Group1" : np.random.randint(1, 3, 100),
"Group2" : np.random.randint(1, 5, 100),
"Value" : np.random.normal(size=100)})
dat.set_index(["Group1", "Group2"], inplace=True)
# How to use this as indices into MultiIndex of dat for t-test?
inds = pd.DataFrame(data={"Group1" : np.random.randint(1, 4, 20),
"Group2" : np.random.randint(2, 6, 20)})
# My attempt using joins, seems quite innefficient
inds["ind"] = True
inds.set_index(["Group1", "Group2"], inplace=True)
df = pd.merge(dat, inds, how='outer', left_index=True, right_index=True)
df['ind'].fillna(False, inplace=True)
# run test
tst = ttest_ind(df.loc[df['ind'], 'Value'],
df.loc[~df['ind'], 'Value'], equal_var=False, nan_policy='omit')
解决方案
如何搜索index
以获取 t 检验的每个子集?这可能会更有效一些。
import numpy as np
import pandas as pd
from scipy.stats import ttest_ind
np.random.seed(999)
dat = pd.DataFrame(data={"Group1" : np.random.randint(1, 3, 100),
"Group2" : np.random.randint(1, 5, 100),
"Value" : np.random.normal(size=100)})
dat.set_index(["Group1", "Group2"], inplace=True)
# How to use this as indices into MultiIndex of dat for t-test?
inds = pd.DataFrame(data={"Group1" : np.random.randint(1, 4, 20),
"Group2" : np.random.randint(2, 6, 20)})
# Up to here the code is the same as yours (without inds["ind"] = True)
inds.set_index(["Group1", "Group2"], inplace=True)
# Only here is different (run test)
tst = ttest_ind(dat.loc[dat.index.isin(inds.index), 'Value'],
dat.loc[~dat.index.isin(inds.index), 'Value'], equal_var=False, nan_policy='omit')
作为旁注,如果我正确理解您的意图,您希望使用总共 100 个样本进行 t 检验。为了在您的原始代码中实现这一点,由于“外部”而导致的重复条目merge
需要使用df.drop_duplicates()
.
希望这可以帮助。
推荐阅读
- r - 在 R 中通过引用传递列表并添加到列表
- python - 从同一笔记本中不同单元格中的类创建类对象
- c# - 如何删除多维数组中的项目,它会改变数组长度吗?
- ruby - 如何将 redmine 插件升级到 rails 5,现在不推荐使用 alias_method_chain
- neo4j - 限制在密码中的查询搜索,而不是限制
- html - 如何使用 ExecWbin VBA 仅打印网站的第一页?
- c# - Xamarin.Forms UWP 应用程序在运行时使用 .net 本机工具链失败,但以其他方式工作
- javascript - 如何在 Jquery EasyUI 中自定义链接按钮大小,而不是使用内置的小尺寸或大尺寸?
- netlogo - 使用网络扩展,如何识别输出中的网络节点?
- java - 无法弄清楚为什么 Intent 没有被传递回以前的活动