转换数据帧而不循环?

时间:2018-12-04 18:01:30

标签: python pandas

我想分析并转换以下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:

Sample 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)

Result of analysis

结果几乎就是我想要的。现在,我需要用数字替换“ x”,例如,将“ xxxx”替换为4,将“ x”替换为1,依此类推。该解决方案在所有列上使用循环:

grouped=df.groupby(['Name'])
dfg=grouped['Cat1','Cat2','Cat3'].sum()
dfg

Final result.

现在,我想知道如何避免该循环并获得相同的最终结果?
非常感谢您分享您的想法和指导。

2 个答案:

答案 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()将为您提供数字答案。