[英]Iterate through rows and columns, python
请你帮我破解计算吗?
我有下表:
我需要做的是将预期频率计算为(行总数*总数)/总计
我假设我需要遍历行和列。 我试过这样做:
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]
出现错误:基于位置的索引只能有[整数,整数切片(START点为INCLUDED,END point为EXCLUDED),listlike of integer,boolean array]类型
我究竟做错了什么?
使用numpy.outer
作为最后一列和最后一行的外积并除以
loc
选择的标量为numpy数组:
t = df.loc['col_sum', 'row_sum']
arr = np.outer(df['row_sum'], df.loc['col_sum']) / t
然后通过contructor创建DataFrame,使用索引删除最后一列ans行:
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
Jezrael给出了一个很好的答案,你使用numpy和pandas计算预期的频率。 您还可以使用python统计库statsmodels来计算这些类型的统计信息。
例如,要计算预期频率表,您可以:
import statsmodels.api as sm
expected_values = sm.stats.Table(df).fittedvalues
更多信息: statsmodels列联表
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.