Python 在不循环的情况下转换数据帧?

Python 在不循环的情况下转换数据帧?,python,pandas,Python,Pandas,我想分析和转换以下数据帧 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)]

我想分析和转换以下数据帧

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)
这将生成如下数据帧:

任务是为“名称”列中的每个唯一条目计算Cat1、Cat2、Cat3列中的“x”。这可以通过groupby()函数的帮助实现:

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

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

for col in range(0,len(dfg.columns)):
    dfg[dfg.columns[col]]=list(map(lambda x: len(x), dfg[dfg.columns[col]]))
dfg

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

试试:

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

根据您的数据来源,可以通过将“x”替换为1并将空单元格设置为0轻松解决此问题。因此,您还必须将列的数据类型更改为整数


然后在您的小组中调用
sum()
将已经为您提供了数字答案。

刚刚添加了最终结果的正确屏幕截图。我认为只需
dfg.applymap(len)
,尽管不确定这是否是最有效的答案是的,很酷,很好,您的解决方案是有效的。非常感谢您的快速回复,非常感谢。我认为斯科特·波士顿的回答是更好的方式,因为它直接计算比赛,避免使用applymap。这种方法只适用于一个字符的匹配,并且会给出错误的计数,因为它也会计算类似于
'y'
谢谢你,Scott。非常优雅,只是一句“一句话”。谢谢你,stekepego,分享你的方法。