python-3.x 从dataframe中获取groupby级别的True和False的总数以及仅True、仅False和真假组合的总数

wnavrhmk  于 2023-08-08  发布在  Python
关注(0)|答案(2)|浏览(93)

我有一个数据框

df = pd.DataFrame([["A",20,True],["C",21,True],["B",20,False],["A",21,False],["B",20,False],["A",20,False]],columns=["id1","id2","val1"])

个字符
我需要在id1和id2 groupby级别的True和False总数。

预期输出1

df_out1 = pd.DataFrame([["A",20,1,1],["A",21,0,1],["B",20,0,2],["C",21,1,0]],columns=["id1","id2","Total_True","Total_False"])
id1 id2 Total_True  Total_False
A   20     1             1
A   21     0             1
B   20     0             2
C   21     1             0

的字符串
此外,我需要另一个输出,告诉有多少id1和id2组合有所有的真值,有多少所有的假值,有多少id1和id2组合既有真值又有假值。

预期输出2

df_out2 = pd.DataFrame([["All_True",1],["All_False",2],["Both_TrueFalse",1]],columns=["Type","Total_id"])
Type           Total_id
All_True           1
All_False          2
Both_TrueFalse     1

的字符串
在Pandas身上怎么做?

vmdwslir

vmdwslir1#

第1部分:计算频率表

s = pd.crosstab([df['id1'], df['id2']], df['val1'])

# val1     False  True 
# id1 id2              
# A   20       1      1
#     21       1      0
# B   20       2      0
# C   21       0      1

字符串
第2部分:使用布尔代数计算满足给定条件的值

m1, m2 = s[True].astype(bool), s[False].astype(bool)
pd.Series({'All_True': sum(m1 & ~m2), 'All_False': sum(~m1 & m2), 'Both': sum(m1 & m2)})

# All_True     1
# All_False    2
# Both         1
# dtype: int64

ogq8wdun

ogq8wdun2#

如果你不需要第一个输出(a crosstab),你可以直接通过计算每个id的平均值(groupby.mean)来得到最后一个,所有的True都会给予你1,所有的False都会给你0,任何组合都会介于两者之间:

(df.groupby(['id1', 'id2'])['val1'].mean()
   .map({1: 'All_True', 0: 'All_False'})
   .fillna('Both_TrueFalse').value_counts()
)

字符串
输出量:

All_False         2
Both_TrueFalse    1
All_True          1
Name: val1, dtype: int64

相关问题