我有一个按熊猫分组的数据框:
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的平均记录数。如何获得平均值?
答案 0 :(得分:1)
只需使用stack
和unstack
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