Apo*_*mer 10 python pandas pandas-groupby
我正在使用 Pandas 并尝试测试一些东西以完全理解某些功能。
在使用以下代码从 csv 加载所有内容后,我正在对我的数据进行分组和聚合:
s = df.groupby(['ID','Site']).agg({'Start Date': 'min', 'End Date': 'max', 'Value': 'sum'})
print(s)
Run Code Online (Sandbox Code Playgroud)
它适用于以下文件:
但它不适用于此文件:
对于第二个文件,我仅获取 56311 ID 的数据。原因是某些列具有空值。但这应该无关紧要。我没有发现任何与此相关的内容。我只找到了如何排除空列。
除了这个问题,在分组之前我应该考虑哪些主要事项?是否有可能因为格式(日期或数字)而排除行?
如果参数NaN列中的 s 出现问题by,则删除组。
因此需要替换NaN为不在Site列中的某个值,并在 groupby 后替换回NaNs:
感谢您Zero使用fillnain简化解决方案groupby:
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}}))
Run Code Online (Sandbox Code Playgroud)
如果需要NaN在MultiIndex:
s = (df.groupby([df['ID'],df['Site'].fillna('tmp')])
.agg({'Start Date': 'min', 'End Date': 'max', 'Value': 'sum'})
.rename(index={'tmp':np.nan}))
Run Code Online (Sandbox Code Playgroud)
样本:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
在 Pandas > 1.1.0 版本中,您可以传递dropna=False以保留 NaN 值(请参阅 参考资料pandas.DataFrame.groupby)。
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18262 次 |
| 最近记录: |