我想分析并转换以下DataFrame
DECLARE @cols AS NVARCHAR(MAX), @sql AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(ReligionName)
FROM Religion c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
Set @sql = '
SELECT ClassId, '+ @cols + ',[NoReligion]
FROM
(
Select
IIf (ReligionName IS NULL, ''NoReligion'', ReligionName) As ReligionName,
employeeid,s.ClassId
From
Student s INNER JOIN
Class ON s.classid = Class.ClassId FULL OUTER JOIN
Religion ON s.religionid = Religion.ReligionId) As src
Pivot
(
Count(employeeid)
FOR ReligionName IN('+@cols+',[NoReligion])
) As pvt'
EXECUTE sp_executesql @sql
这将产生一个这样的DataFrame:
任务是为“名称”列中每个唯一条目的Cat1,Cat2,Cat3列中的“ x”计数。这可以通过groupby()函数的帮助来实现:
import random
import string
import numpy as np
import pandas as pd
# generate example dataframe
df=pd.DataFrame()
df['Name']=[str(x) for x in np.random.choice(['a','b','c'],10)]
df['Cat1']=[str(x) for x in np.random.choice(['x',''],10)]
df['Cat2']=[str(x) for x in np.random.choice(['x',''],10)]
df['Cat3']=[str(x) for x in np.random.choice(['x',''],10)]
df.head(10)
结果几乎就是我想要的。现在,我需要用数字替换“ x”,例如,将“ xxxx”替换为4,将“ x”替换为1,依此类推。该解决方案在所有列上使用循环:
grouped=df.groupby(['Name'])
dfg=grouped['Cat1','Cat2','Cat3'].sum()
dfg
现在,我想知道如何避免该循环并获得相同的最终结果?
非常感谢您分享您的想法和指导。
答案 0 :(得分:2)
尝试:
df.set_index('Name').eq('x')\
.groupby('Name')['Cat1','Cat2','Cat3'].sum()\
.astype(int).reset_index()
输出:
Name Cat1 Cat2 Cat3
0 a 5 3 4
1 b 1 1 0
2 c 1 1 1
答案 1 :(得分:0)
根据您的数据源,可以通过将“ x”替换为1并将空白单元格设置为0来轻松解决。因此,您还必须将列的数据类型更改为整数。
然后在您的小组中致电sum()
将为您提供数字答案。