使用 pandas' 交叉表时出现 ValueError
ValueError when using pandas' crosstab
我确定一定有一个快速修复方法,但我找不到一个有很好解释的答案。我正在寻找遍历数据框并使用 pandas 为每对列构建一个交叉表。我从原始数据中提取了 2 列子集,并删除了带有 unsuitable 数据的行。对于剩余的数据,我希望做一个交叉表以最终建立一个应急 table 来进行 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' 缺少数据,因此我在生成意外事件 table 之前删除了这些行,我希望从中生成意外事件 table 的其余值都是 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
两个相同实体之间的交叉表没有意义。 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
我确定一定有一个快速修复方法,但我找不到一个有很好解释的答案。我正在寻找遍历数据框并使用 pandas 为每对列构建一个交叉表。我从原始数据中提取了 2 列子集,并删除了带有 unsuitable 数据的行。对于剩余的数据,我希望做一个交叉表以最终建立一个应急 table 来进行 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' 缺少数据,因此我在生成意外事件 table 之前删除了这些行,我希望从中生成意外事件 table 的其余值都是 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
两个相同实体之间的交叉表没有意义。 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