【问题标题】:Is there anyway to ungroup data in a grouped-by pandas dataframe?无论如何要取消分组熊猫数据框中的数据吗?
【发布时间】:2017-08-22 01:52:59
【问题描述】:

我有一个数据集,为简单起见,我需要根据一列进行分组和聚合,以便我可以轻松删除一些行。完成计算后,我需要按操作反转分组,以便可以在 Excel 中轻松查看数据框。如果我不反转操作,我会将整个列表导出到不容易分析的 excel 中。非常感谢任何帮助。

例子:

Col1  Col2 Col3
123   11   Yes
123   22   Yes
256   33   Yes
256   33   No
337   00   No
337   44   No

应用groupby和聚合后:

X=dataset.groupby('Col1').agg(lambda x:set(x)).reset_index()

我明白了

Col1   Col2      Col3
123   {11,22}   {Yes}
256   {33}      {Yes, No}
337   {00,44}   {No}

然后我使用 drop 删除所有包含 Yes 的列

X=X.reset_index(drop=True)

在导出到 excel 之前我需要得到的是

Col1 Col2 Col3
337   00   No
337   44   No

希望这足够清楚

提前谢谢

【问题讨论】:

  • X.reset_index(drop=True) 不会更改数据框中的任何内容。目前尚不清楚您为什么拥有它以及您期望它做什么。请包括预期结果。
  • 对不起,我的意思是:YY=set('Yes') X=X.drop(X[X.Col3==YY].index)

标签: python pandas dataframe group-by pandas-groupby


【解决方案1】:

我不认为转换成一个集合是一个好主意。这里有一个替代方案:首先按Col3 降序排序,然后创建Col2 : Yes/No 的映射并基于此进行过滤。

In [1191]: df = df.sort_values('Col3', ascending=True)

In [1192]: mapping = dict(df[['Col2', 'Col3']].values)

In [1193]: df[df.Col2.replace(mapping) == 'No'] # or df.Col2.map(mapping)
Out[1193]: 
   Col1  Col2 Col3
4   337     0   No
5   337    44   No

【讨论】:

  • 那是明智的replace
【解决方案2】:

我同意 COLDSPEED。你不需要转换来设置

df['Temp']=df.Col3.eq('Yes')
DF=df.groupby('Col1')['Temp'].sum()
df[df.Col1==DF.index[DF==0].values[0]].drop('Temp',axis=1)


Out[113]: 
   Col1  Col2 Col3
4   337     0   No
5   337    44   No

【讨论】:

  • 谢谢。我想我需要重写我的代码。我正在处理太多列,需要修改您的方法以将其应用于我的实际数据。我提供的只是我想做的一个超级简化的版本。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2019-05-03
  • 2022-01-12
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多