首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas group by :包括所有行,甚至包括列值为空的行

Pandas group by :包括所有行,甚至包括列值为空的行
EN

Stack Overflow用户
提问于 2017-10-22 22:12:56
回答 2查看 20K关注 0票数 10

我正在使用Pandas,并试图测试一些东西,以完全理解一些功能。

在使用以下代码从csv加载所有内容后,我将对数据进行分组和聚合:

代码语言:javascript
复制
s = df.groupby(['ID','Site']).agg({'Start Date': 'min', 'End Date': 'max', 'Value': 'sum'})
print(s)

它适用于以下文件:

但它不适用于此文件:

对于第二个文件,我只获取了ID为56311的数据,原因是有些列的值为空。但这应该无关紧要。我还没有找到任何与此相关的东西。我只知道如何排除空列。

除了这个问题,我在分组前需要考虑的主要问题是什么?例如,有没有可能因为格式(日期或数字)而排除行?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-22 22:15:52

如果NaN%s in by参数中的列有问题,则将删除组。

因此需要将NaN替换为不在Site列中某个值,并在groupby替换回NaN之后:

感谢Zerogroupby中使用fillna简化了解决方案

代码语言:javascript
复制
df1= (df.groupby([df['ID'],df['Site'].fillna('tmp')])
        .agg({'Start Date': 'min', 'End Date': 'max', 'Value': 'sum'})
        .reset_index()
        .replace({'Site':{'tmp': np.nan}}))

如果需要在MultiIndex中使用NaN%s

代码语言:javascript
复制
s = (df.groupby([df['ID'],df['Site'].fillna('tmp')])
       .agg({'Start Date': 'min', 'End Date': 'max', 'Value': 'sum'})
       .rename(index={'tmp':np.nan}))

示例:

代码语言:javascript
复制
df = pd.DataFrame({'A':list('abcdef'),
                   'Site':[np.nan,'a',np.nan,'b','b','a'],
                   'Start Date':pd.date_range('2017-01-01', periods=6),
                   'End Date':pd.date_range('2017-11-11', periods=6),
                   'Value':[7,3,6,9,2,1],
                   'ID':list('aaabbb')})

print (df)
   A   End Date ID Site Start Date  Value
0  a 2017-11-11  a  NaN 2017-01-01      7
1  b 2017-11-12  a    a 2017-01-02      3
2  c 2017-11-13  a  NaN 2017-01-03      6
3  d 2017-11-14  b    b 2017-01-04      9
4  e 2017-11-15  b    b 2017-01-05      2
5  f 2017-11-16  b    a 2017-01-06      1

代码语言:javascript
复制
df1= (df.groupby([df['ID'],df['Site'].fillna('tmp')])
        .agg({'Start Date': 'min', 'End Date': 'max', 'Value': 'sum'})
        .reset_index()
        .replace({'Site':{'tmp': np.nan}}))

print (df1)
  ID Site   End Date Start Date  Value
0  a    a 2017-11-12 2017-01-02      3
1  a  NaN 2017-11-13 2017-01-01     13
2  b    a 2017-11-16 2017-01-06      1
3  b    b 2017-11-15 2017-01-04     11

s = (df.groupby([df['ID'],df['Site'].fillna('tmp')])
       .agg({'Start Date': 'min', 'End Date': 'max', 'Value': 'sum'})
       .rename(index={'tmp':np.nan}))

print (s)
          End Date Start Date  Value
ID Site                             
a  a    2017-11-12 2017-01-02      3
   NaN  2017-11-13 2017-01-01     13
b  a    2017-11-16 2017-01-06      1
   b    2017-11-15 2017-01-04     11
票数 7
EN

Stack Overflow用户

发布于 2020-10-06 22:44:13

在大于1.1.0的Pandas版本中,您可以传递dropna=False来保留NaN值(请参阅pandas.DataFrame.groupby)。

代码语言:javascript
复制
In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: pd.__version__
Out[3]: '1.1.2'

In [4]: df = pd.DataFrame([[1, 2], [3, 4], [np.nan, 6]], columns=["A", "B"])

In [5]: df
Out[5]: 
     A  B
0  1.0  2
1  3.0  4
2  NaN  6

In [6]: df.groupby("A").mean()
Out[6]: 
     B
A     
1.0  2
3.0  4

In [7]: df.groupby("A", dropna=False).mean()
Out[7]: 
     B
A     
1.0  2
3.0  4
NaN  6
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46875065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档