我是python3的新手,正在尝试对pandas数据框中的列进行卡方测试。我的列是成对的:observed_count_column_1,预期count_column_1,observed_count_column_2,expected_count_column_2,依此类推。我想做一个循环以一次完成所有的列对。
如果我手动指定列索引整数或列名称,我将成功执行此操作。 可行
from scipy.stats import chisquare
import pandas as pd
df = pd.read_csv (r'count.csv')
chisquare(df.iloc[:,[0]], df.iloc[:,[1]])
尝试循环,不会:
from scipy.stats import chisquare
import pandas as pd
df = pd.read_csv (r'count.csv')
for n in [0,2,4,6,8,10]:
chisquare(df.iloc[:,[n]], df.iloc[:,[n+1]]
循环代码似乎根本没有运行,我也没有错误,但是也没有输出。
我想知道为什么会这样,我该如何实际解决呢?
谢谢你, 丹
答案 0 :(得分:0)
chisquare()函数返回两个值,因此您可以尝试以下操作:
for n in range(0, 11, 2):
chisq, p = chisquare(df.iloc[:,[n]], df.iloc[:,[n+1]]
print('Chisq: {}, p-value: {}'.format(chisq, p))
您可以在https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chisquare.html
的文档中找到返回的内容答案 1 :(得分:0)
考虑从元组列表构建卡方结果的数据框,然后将列名称分配为观察和预期频率的指示符(通过索引符号替换偶数/奇数列):
# CREATE DATA FRAME FROM LIST IF TUPLES
# THEN ASSIGN COLUMN NAMES
chi_square_df = (pd.DataFrame([chisquare(df.iloc[:,[n]], df.iloc[:,[n+1]]) \
for n in range(0,11,2)],
columns = ['chi_sq_stat', 'p_value'])
.assign(obs_freq = df.columns[::2],
exp_freq = df.columns[1::2])
)
答案 2 :(得分:0)
谢谢您的建议。使用Parfait注释中的信息,该循环没有打印,尽管设法不如上面的解决方案那么优雅,但我设法找到了解决方案。
for n in range(0, 11, 2):
print(chisquare(df.iloc[:,[n]], df.iloc[:,[n+1]]))
这给出了预期的结果。
丹