使用pandas时的ValueError'交叉表

时间:2017-09-15 11:56:02

标签: python pandas pivot-table chi-squared

我确定必须有一个快速修复,但我找不到一个好的解释答案。我正在寻找迭代数据帧并为每对带有pandas的列构建交叉表。我已从原始数据中对2个cols进行了子集化,并删除了包含不合适数据的行。对于剩下的数据,我希望做一个交叉表,最终建立一个列联表来进行ChiX测试。这是我的代码:

my_data = pd.read_csv(DATA_MATRIX, index_col=0) #GET DATA
AM = pd.DataFrame(columns=my_data.columns, index = my_data.columns) #INITIATE DF TO HOLD ChiX-result

for c1 in my_data.columns:
    for c2 in my_data.columns:
        sample_df = pd.DataFrame(my_data, columns=[c1,c2])  #make df to do ChiX on
        sample_df = sample_df[(sample_df[c1] != 0.5) | (sample_df[c2] != 0.5)].dropna() # remove unsuitable rows

        contingency = pd.crosstab(sample_df[c1], sample_df[c2]) ##This doesn't work?

        # DO ChiX AND STORE P-VALUE IN 'AM': CODE STILL TO WRITE

数据框包含值0.0,0.5,1.0。 ' 0.5'缺少数据,所以我在制作列联表之前删除这些行,我希望从中列出列联表的其余值都是0.0或1.0。我已经检查了代码工作到目前为止。打印到控制台的错误是:

ValueError: If using all scalar values, you must pass an index

如果有人能解释为什么这不起作用?帮助以任何方式解决?或者甚至更好地提供一种替代方法来对列进行ChiX测试,这将非常有用,提前感谢!

编辑:sample_df

的前几行结构示例
           col1  col2
    sample1 1   1
    sample2 1   1
    sample3 0   0
    sample4 0   0
    sample5 0   0
    sample6 0   0
    sample7 0   0
    sample8 0   0
    sample9 0   0
    sample10    0   0
    sample11    0   0
    sample12    1   1

1 个答案:

答案 0 :(得分:1)

两个相同实体之间的交叉表毫无意义。 pandas会告诉你:

ValueError: The name col1 occurs multiple times, use a level number

这意味着它假设您从具有相同名称的多索引数据框中传递了两个不同的列。

在您的代码中,您将在嵌套循环中迭代列,因此出现c1 == c2的情况,因此pd.crosstab出错。

修复将涉及添加if检查并在列相等时跳过该迭代。所以,你要这样做:

for c1 in my_data.columns:
    for c2 in my_data.columns:
        if c1 == c2:
            continue

        ...  # rest of your code