使用循环调用多个熊猫数据框列

时间:2019-11-06 16:12:25

标签: python-3.x pandas loops dataframe

我是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]]

循环代码似乎根本没有运行,我也没有错误,但是也没有输出。

我想知道为什么会这样,我该如何实际解决呢?

谢谢你, 丹

3 个答案:

答案 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]]))

这给出了预期的结果。