我有一个数据框,其中包含一个日历月的所有日期的列表。
我有另一个数据框,每天都有工作人员到场。我正在尝试建立一个新的数据框,以合并这两个数据框。
以下是df1的外观:
private void setMinMax(Chart chart, ChartArea ca)
{
var allPoints = chart.Series.SelectMany(x => x.Points);
double minx = allPoints.Select(x => x.XValue).Min();
double miny = allPoints.Select(x => x.YValues[0]).Min();
double maxx = allPoints.Select(x => x.XValue + ((SizeF)x.Tag).Width).Max();
double maxy = allPoints.Select(x => x.YValues[0] + ((SizeF)x.Tag).Height).Max();
ca.AxisX.Minimum = minx;
ca.AxisX.Maximum = maxx;
ca.AxisY.Minimum = miny;
ca.AxisY.Maximum = maxy;
}
df2如下所示:
date
10/1/2018
10/2/2018
10/3/2018
我正在尝试合并以上两个数据帧,以使输出如下:
date,emp_id
10/1/2018,staff_1
10/1/2018,staff_2
10/1/2018,staff_3
10/2/2018,staff_1
10/2/2018,staff_2
10/3/2018,staff_3
任何人都可以建议,鉴于手头的数据,我该如何创建最终的数据框,
答案 0 :(得分:3)
我相信您需要使用默认内部联接的merge
,如果需要计数值,则需要crosstab
:
df = df1.merge(df2)
print (df)
date emp_id
0 10/1/2018 staff_1
1 10/1/2018 staff_2
2 10/1/2018 staff_3
3 10/2/2018 staff_1
4 10/2/2018 staff_2
5 10/3/2018 staff_3
6 10/2/2018 staff_2
7 10/3/2018 staff_3
df['date'] = pd.to_datetime(df['date'])
df1 = pd.crosstab(df['emp_id'], df['date'])
print (df1)
date 2018-10-01 2018-10-02 2018-10-03
emp_id
staff_1 1 1 0
staff_2 1 2 0
staff_3 1 0 2
或将max
与get_dummies
用于指示符列:
df2 = pd.get_dummies(df.set_index('emp_id')['date']).max(level=0)
print (df2)
2018-10-01 2018-10-02 2018-10-03
emp_id
staff_1 1 1 0
staff_2 1 1 0
staff_3 1 0 1
答案 1 :(得分:1)
您可以使用pd.pivot_table:
In [2209]: df = df1.merge(df2)
In [2205]: pd.pivot_table(df, index='emp_id', columns='date', aggfunc=len, fill_value=0)
Out[2205]:
date 10/1/2018 10/2/2018 10/3/2018
emp_id
staff_1 1 1 0
staff_2 1 1 0
staff_3 1 0 1