python:标称变量(计数)
我有以下数据框:python:标称变量(计数),python,pandas,dataframe,summarize,Python,Pandas,Dataframe,Summarize,我有以下数据框: 关键产品参数是/否 1 AAA Paramy 1 1 AAA参数2 N 1 AAA参数3 N 2 AAA参数1 N 2 AAA Paramy 2 2 AAA Paramy 3 3 CCC参数1 3.2 3.3.3 我感兴趣的是按PROD和PARAMETER列汇总Y/N列值,并获得以下输出: PROD参数Y N AAA参数1 AAA参数2 1 AAA参数3 1 CCC参数11 0 CCC2 1 0 CCC参数3 1 0 而Y和N值是原始数据框中Y/N列值的计数。您可以通过创建
关键产品参数是/否
1 AAA Paramy 1
1 AAA参数2 N
1 AAA参数3 N
2 AAA参数1 N
2 AAA Paramy 2
2 AAA Paramy 3
3 CCC参数1
3.2
3.3.3
我感兴趣的是按PROD和PARAMETER列汇总Y/N列值,并获得以下输出:
PROD参数Y N
AAA参数1
AAA参数2 1
AAA参数3 1
CCC参数11 0
CCC2 1 0
CCC参数3 1 0
而Y和N值是原始数据框中Y/N列值的计数。您可以通过创建一个附加列来使用,该列的值为1,因为这两种方式都不重要(您只对它们进行计数)
在这种情况下,最简单的操作是生成Y/N列中存在的值的频率计数:
pd.crosstab([df['PROD'], df['PARAMETER']], df['Y/N'])
您希望获得
Y/N
列中的值的计数,按PROD
和参数
分组
import io
import pandas as pd
data = io.StringIO('''\
KEY PROD PARAMETER Y/N
1 AAA PARAM1 Y
1 AAA PARAM2 N
1 AAA PARAM3 N
2 AAA PARAM1 N
2 AAA PARAM2 Y
2 AAA PARAM3 Y
3 CCC PARAM1 Y
3 CCC PARAM2 Y
3 CCC PARAM3 Y
''')
df = pd.read_csv(data, delim_whitespace=True)
res = (df.groupby(['PROD', 'PARAMETER'])['Y/N'] # Group by `PROD` and `PARAMETER`
# and select the `Y/N` column
.value_counts() # Get the count of values
.unstack('Y/N') # Long-to-wide format change
.fillna(0) # Fill `NaN`s with zero
.astype(int)) # Cast to integer
print(res)
输出:
<代码>是/否
生产参数
AAA参数1
参数2 1
参数3 1
CCC参数1 0 1
参数2 0 1
参数3 0 1
嗨,菲利克斯,到目前为止你试过什么?试过pd.melt和pd.pivot\u表。没有成功嘿,菲利克斯,你能在代码行中给我们一个df的样本,这样我们就可以玩它了吗?@StevenG,是你的朋友;)啊,我忘了交叉表!很好的解决方案!甚至是我。我刚想起来。以前一直在思考
groupby
/pivot
。
import io
import pandas as pd
data = io.StringIO('''\
KEY PROD PARAMETER Y/N
1 AAA PARAM1 Y
1 AAA PARAM2 N
1 AAA PARAM3 N
2 AAA PARAM1 N
2 AAA PARAM2 Y
2 AAA PARAM3 Y
3 CCC PARAM1 Y
3 CCC PARAM2 Y
3 CCC PARAM3 Y
''')
df = pd.read_csv(data, delim_whitespace=True)
res = (df.groupby(['PROD', 'PARAMETER'])['Y/N'] # Group by `PROD` and `PARAMETER`
# and select the `Y/N` column
.value_counts() # Get the count of values
.unstack('Y/N') # Long-to-wide format change
.fillna(0) # Fill `NaN`s with zero
.astype(int)) # Cast to integer
print(res)