Python Pandas Groupby:如何获取不同的列值

Python Pandas Groupby:如何获取不同的列值,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,尝试在分组后为列获取不同的值;但是我得到了一个总数 groupby正在删除对象区分并丢失列的前导零 df=pd.read_csv(“trial.txt”,sep='|',converters={'zip':str},keep_default_na=True,low_memory=False) 数据: Emp State Zip Jan feb mar Int NY 11111 1 0 1 int NY 11111 1 1 0

尝试在分组后为列获取不同的值;但是我得到了一个总数 groupby正在删除对象区分并丢失列的前导零

df=pd.read_csv(“trial.txt”,sep='|',converters={'zip':str},keep_default_na=True,low_memory=False)

数据:

Emp State   Zip      Jan feb mar 

Int  NY    11111      1   0   1

int  NY    11111      1   1   0

int  NC    09999      2   2   0

int  ON    NH443     2   2   2
之后

df2 = df.groupby("Zip").count()
zip=11111的zip my输出的df2 我将有所有12个月的输出显示2。 如果我期望的是211 邮政编码09999显示为9999

分组不获取不同列值的错误。
具有非空值的帐户(不存在空值)。列值仅为(0、1、2)

count
返回每个组的计数,不包括缺少的值。这意味着零值也将包含在计数中。若要仅对正值进行计数,可以应用lambda函数对大于零的值的计数求和

>>> df.groupby('Zip')[['Jan', 'feb', 'mar']].apply(lambda x: x.gt(0).sum())
       Jan  feb  mar
Zip                 
09999    1    1    0
11111    2    1    1
NH443    1    1    1
让我们从为什么Zip列被读取为int开始

请注意细微的区别:

  • 源文件中的第三列名称是Zip,大写字母为Z
  • 在代码中,您将converters={'zip':str}与列名放在一起 以小写字母开始
将其更改为converters={Zip':str},将显示有问题的列 读作字符串

另一个可能更好的解决方案是传递dtype={'Zip':object}。 我写得更好,因为实际上不需要转换。 只需指定列类型就足够了

我还进行了额外检查,即我在最后一行更改了邮政编码 从NH443到88443

因此,即使源文件中的此列仅包含数字(在所有行中), 它的类型将是object,实际上是string

现在让我们看看代码的实际结果:

运行
df2=df.groupby('Zip').count()时,结果是:

       Emp  State  Jan  Feb  Mar 
Zip                              
09999    1      1    1    1     1
11111    2      2    2    2     2
88443    1      1    1    1     1
         Emp State  Jan     Feb    Mar 
Zip                                    
09999  [Int]  [NC]  [2]     [2]     [0]
11111  [Int]  [NY]  [1]  [0, 1]  [0, 1]
88443  [Int]  [ON]  [2]     [2]     [2]
注意计数函数的描述(GroupBy变量), 其内容为:计算组的计数,不包括缺少的值。 由于您没有传递任何列列表,因此将计算此计数 所有列

因此,您的代码不会生成不同的值,而是计数 每组中每列的非空值

如果您想要您在标题中所写的内容,即 不同的值,对于每一列(不是它们的计数),运行:

这一次的结果是:

       Emp  State  Jan  Feb  Mar 
Zip                              
09999    1      1    1    1     1
11111    2      2    2    2     2
88443    1      1    1    1     1
         Emp State  Jan     Feb    Mar 
Zip                                    
09999  [Int]  [NC]  [2]     [2]     [0]
11111  [Int]  [NY]  [1]  [0, 1]  [0, 1]
88443  [Int]  [ON]  [2]     [2]     [2]
例如,组11111包含在二月和三月列中 两个不同的值:0和1

在所有其他情况下(对于示例数据),每列 在每组中,包含一个独立的值,
因此相应的列表只包含一个元素。

您能为所需的输出添加一个示例吗?