在熊猫中修复Groupby长度

时间:2019-04-18 00:53:22

标签: python python-3.x pandas pandas-groupby

我有一个按熊猫分组的数据框:

id    date    temperature
1  2011-9-12   12
   2011-9-18   12
   2011-9-19   12
2  2011-9-12   15
3  2011-9-12   15
   2011-9-16   15

这里,每个id都有不同数量的温度记录。

我想修复它们,例如每个id的平均记录数(例如3)。如果缺少某些记录,我想先放入零。

即我的最终数据框应该是:

id    temperature
1     12
      12
      12
2     0
      0
      15
3     0
3     15
3     15

我需要将每个id的记录数自定义为一些数字,也可以是每个id的平均记录数。如何获得平均值?

2 个答案:

答案 0 :(得分:1)

只需使用stackunstack

df.groupby(level=0)['temperature'].\
      apply(list).\
         apply(pd.Series).iloc[:,:3].\
                 apply(lambda x : pd.Series(sorted(x,key=pd.notnull)),1).\
                   fillna(0).stack().reset_index(level=0)
Out[523]: 
   id     0
0   1  12.0
1   1  12.0
2   1  12.0
0   2   0.0
1   2   0.0
2   2  15.0
0   3   0.0
1   3  15.0
2   3  15.0

脾气暴躁的解决方案

s=df.groupby(level=0)['temperature'].apply(list)
s1=s.tolist()
arr = np.zeros((len(s1),3),int)
lens = [3-len(l) for l in s1]
mask = np.arange(3) >=np.array(lens)[:,None]
arr[mask] = np.concatenate(s1)
pd.DataFrame({'id':s.index.repeat(3),'temperature':arr.ravel()})

答案 1 :(得分:1)

在访问groupby元素时,我们可以将import java.awt.Color; import java.awt.Font; import java.text.DecimalFormat; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.stage.Stage; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.fx.ChartViewer; import org.jfree.chart.labels.PieSectionLabelGenerator; import org.jfree.chart.labels.StandardPieSectionLabelGenerator; import org.jfree.chart.plot.PiePlot; import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.general.PieDataset; /** * @see https://stackoverflow.com/a/55737893/230513 * @see https://stackoverflow.com/q/44289920/230513 */ public class PieChartFX extends Application { private static PieDataset createDataset() { DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("A", 0.8); dataset.setValue("B", 9.4); dataset.setValue("C", 0.1); dataset.setValue("D", 89.5); dataset.setValue("E", 0.2); dataset.setValue("F", 0.0); return dataset; } private static JFreeChart createChart(String name) { PieDataset dataset = createDataset(); JFreeChart chart = ChartFactory.createPieChart( name, dataset, false, true, false); PiePlot plot = (PiePlot) chart.getPlot(); plot.setOutlineVisible(false); plot.setSectionPaint("A", Color.RED); plot.setSectionPaint("B", Color.BLUE); plot.setSectionPaint("C", Color.GREEN); plot.setSectionPaint("D", Color.YELLOW); plot.setSectionPaint("E", Color.CYAN); plot.setLabelFont(new Font(Font.SANS_SERIF, Font.BOLD, 16)); // Custom labels https://stackoverflow.com/a/17507061/230513 PieSectionLabelGenerator gen = new StandardPieSectionLabelGenerator( "{0}: {2}", new DecimalFormat("0"), new DecimalFormat("0.0%")); plot.setLabelGenerator(gen); return chart; } @Override public void start(Stage stage) { TabPane tabPane = new TabPane( new Tab("Tab 1", new ChartViewer(createChart("One"))), new Tab("Tab 2", new ChartViewer(createChart("Two"))), new Tab("Tab 3", new ChartViewer(createChart("Three"))) ); stage.setScene(new Scene(tabPane)); stage.setTitle("JFreeChart: PieChartFX"); stage.setWidth(600); stage.setHeight(400); stage.show(); } public static void main(String[] args) { launch(args); } } reindex一起使用。 之后,我们range(3)并将sort_values设置为第一位置,因此我们可以将NaN设置为0。

fillna

注意,您将df_new = pd.concat([ d[['id', 'temperature']].reset_index(drop=True).reindex(range(3)).sort_values('id', na_position='first') for _, d in df.groupby('id') ], ignore_index=True) df_new['id'].fillna(method='bfill', inplace=True) df_new['temperature'].fillna(0, inplace=True) print(df_new) id temperature 0 1.0 12.0 1 1.0 12.0 2 1.0 12.0 3 2.0 0.0 4 2.0 0.0 5 2.0 15.0 6 3.0 0.0 7 3.0 15.0 8 3.0 15.0 id作为索引,因此首先运行:

date