如何在 python 中编写交叉表查询?

hwo to write crosstab query in python?

我在 python 中有一个函数在数据帧上使用交叉表

def event_mouhafaza(self,df):
        df_event_mohafazat_crosstab = pd.crosstab(df['event_mohafaza'],df['event_type'])
        print(df_event_mohafazat_crosstab)        

以上函数正常工作,return 预期结果。

当我尝试用变量替换交叉表查询的值时系统崩溃。

def event_mouhafaza(self,df,items):
   
     for item in items:
         item1 = items[0]
         item2 = items[1]
        
     df = df.set_index(item2)    
     df_event_mohafazat_crosstab = pd.crosstab(df,item1,item2)
     print(df_event_mohafazat_crosstab)

并显示此错误:

df_event_mohafazat_crosstab = pd.crosstab(df,item1,item2)
  File "F:\AIenv\lib\site-packages\pandas\core\reshape\pivot.py", line 577, in crosstab
    raise ValueError("values cannot be used without an aggfunc.")
ValueError: values cannot be used without an aggfunc.

第二个函数哪里出错了,如何解决?

您在第二个示例中错误地使用了交叉表函数。 pd.crosstab 不将数据帧作为其第一个参数。现在你正在调用这样的函数(使用 kwargs 来突出显示问题)。当您指定 values 参数时(就像您使用位置参数一样),pandas 也希望将某些内容也传递到 aggfunc 参数中。有关详细信息,请参阅文档。

# This will error out.
pd.crosstab(index=df, columns=item1, values=item2)

如果 item1item2 是数据框中列的名称,您需要这样做:

pd.crosstab(index=df[item1], columns=df[item2])

接下来,如果您打算在交叉制表中使用它,您实际上并不希望将它设置为索引。而你的 for-loop 实际上没有做任何事情,你可以在没有它的情况下分配 item1 和 item2:

def event_mouhafaza(self,df,items):
   
     item1 = items[0]
     item2 = items[1]
        
     df_event_mohafazat_crosstab = pd.crosstab(index=df[item1], columns=df[item2])
     print(df_event_mohafazat_crosstab)