[英]How to Apply pd.crosstab using Lambda
For the below pandas dataframe:对于以下 pandas dataframe:
col = ["Q1", "Q2", "Cat"]
data = [
["Y","Y","BIN"],
["Y","N","CIN"],
["N","N","BIN"],
["N","Y","CIN"],
["Y","Y","BIN"]
]
df = pd.DataFrame(data, columns=col)
Output df
: Output df
:
Q1 Q2 Cat
0 Y Y BIN
1 Y N CIN
2 N N BIN
3 N Y CIN
4 Y Y BIN
I want to take crosstab "Cat" with "Q1 and Q2" in one go.我想在一个 go 中使用带有“Q1 和 Q2”的交叉表“Cat”。 For which I tried apply with lambda:我尝试使用 lambda 申请:
x = pandas.Series(["Q1", "Q2"])
a1 = x.apply(lambda a: pd.crosstab(df[a],df["Cat"]))
I am getting some weird results from this:我得到了一些奇怪的结果:
0 Cat BIN CIN
Q1
N 1 1
Y ...
1 Cat BIN CIN
Q2
N 1 1
Y ...
dtype: object
Whereas when I try the same using a for loop I am getting the below-desired result:而当我使用 for 循环尝试相同的操作时,我得到了以下期望的结果:
for i in x:
a = pd.crosstab(df[i],df["Cat"])
print(a)
Desired output:所需的 output:
Cat BIN CIN
Q1
N 1 1
Y 2 1
Cat BIN CIN
Q2
N 1 1
Y 2 1
Please help me with the error happening in taking the Crosstab with apply + lambda.请帮助我解决使用 apply + lambda 获取交叉表时发生的错误。
You may not need to use lambda with the crosstab您可能不需要将 lambda 与交叉表一起使用
pd.crosstab([df.Q1, df.Q2], df.Cat)
IIUC, use melt
, then pd.crosstab
: IIUC,使用melt
,然后使用pd.crosstab
:
df_melt = df.melt('Cat')
pd.crosstab([df_melt['variable'],df_melt['value']], df_melt['Cat'])
Output: Output:
Cat BIN CIN
variable value
Q1 N 1 1
Y 2 1
Q2 N 1 1
Y 2 1
For printing groups对于打印组
df_out = pd.crosstab([df_melt['variable'],df_melt['value']], df_melt['Cat'])
for _, i in df_out.groupby(level=0):
print(i)
Output: Output:
Cat BIN CIN
variable value
Q1 N 1 1
Y 2 1
Cat BIN CIN
variable value
Q2 N 1 1
Y 2 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.