用python迭代行和列

用python迭代行和列,python,pandas,Python,Pandas,请你帮我算算一下好吗 我有下表: 我需要做的是将预期频率计算为(行总数*列总数)/总计 预期结果: 我假设我需要遍历行和列。我试着用: for i, row in df_dropped.iterrows(): for j, column in row.iteritems(): data[row][column] = df_dropped.iloc[i, 3] * df_dropped.iloc[2, j] 出现以下错误: 基于位置的索引只能有[integer,integer sli

请你帮我算算一下好吗

我有下表:

我需要做的是将预期频率计算为(行总数*列总数)/总计

预期结果:

我假设我需要遍历行和列。我试着用:

for i, row in df_dropped.iterrows():
for j, column in row.iteritems():
    data[row][column] = df_dropped.iloc[i, 3] * df_dropped.iloc[2, j]
出现以下错误: 基于位置的索引只能有[integer,integer slice(包括起点,不包括终点),整数列表,布尔数组]类型

我做错了什么?

用于最后一列和最后一行的外积并除以
由选定的标量到numpy数组:

t = df.loc['col_sum', 'row_sum']
arr = np.outer(df['row_sum'], df.loc['col_sum']) / t
然后由contructor创建DataFrame,并为删除最后一列和行建立索引:

df1 = pd.DataFrame(arr[:-1, :-1], 
                   columns=df.columns[:-1],
                   index=df.index[:-1]).add_prefix('exp_')
print (df1)
   exp_satisfied  exp_neutral  exp_dissatisfied
0      24.605263    20.842105          9.552632
1     145.394737   123.157895         56.447368
获取新列名称:

cols = [item for x in df.columns[:-1] for item in (x, 'exp_' + x)]
print (cols)
['satisfied', 'exp_satisfied', 'neutral', 'exp_neutral', 'dissatisfied', 'exp_dissatisfied']
通过和连接在一起,以实现列的预期顺序:

df = pd.concat([df.iloc[:-1, :-1], df1], axis=1).reindex(columns=cols)
print (df)
   satisfied  exp_satisfied  neutral  exp_neutral  dissatisfied  \
0         30      24.605263       17    20.842105             8   
1        140     145.394737      127   123.157895            58   

   exp_dissatisfied  
0          9.552632  
1         56.447368  

耶兹雷尔给出了一个很好的答案,你正在使用numpy和pandas计算预期频率。 您还可以使用python统计库来计算这些类型的统计数据

例如,要计算预期频率表,可以执行以下操作:

import statsmodels.api as sm
expected_values = sm.stats.Table(df).fittedvalues

更多信息:

谢谢你,耶兹雷尔,再问一个问题就好了。以下是最终结果:def expected_frequency(data):“函数计算预期频率””data['row_sum']=data.sum(axis=1)data.loc['col_sum']=data.sum()t=data.loc['col_sum','row_sum']arr=np.outer(data['row_sum'],data.loc['col sum'])/float(t)data2=pd.DataFrame(arr[:-1,:-1],columns=data.columns[:-1])。添加_前缀('exp_')data=pd.concat([data.iloc[:-1,:-1],data2],axis=1)返回预期的_频率(df_已删除)。我的问题是,如何将函数表存储为永久表?@eponkratova-是吗?不确定是否理解,您认为如何分配
df1=预期频率(df)
-将函数应用于名为
df
的数据帧,并分配给
df1
是的……这很简单。我想创建一个空的df,然后对它应用一个函数,如果有意义的话。成为一个新人很好,你可以想出完全荒谬的解决方案。是的。我也觉得交叉表可以工作。感谢您提供的单线解决方案!