熊猫-创建一个日期为一个df的新数据框,并在另一个df中创建人员详细信息

时间:2018-12-10 12:49:19

标签: pandas pandas-groupby

我有一个数据框,其中包含一个日历月的所有日期的列表。

我有另一个数据框,每天都有工作人员到场。我正在尝试建立一个新的数据框,以合并这两个数据框。

以下是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

任何人都可以建议,鉴于手头的数据,我该如何创建最终的数据框,

2 个答案:

答案 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

或将maxget_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