在熊猫上选择一列(从datetime.timestamp返回date)

时间:2018-09-07 06:43:29

标签: python pandas datetime timestamp

我正在尝试在熊猫上选择一列。该列是来自时间戳数据的dt.date(来自datetime)的结果。为了更好地了解这个问题,这里是完整的故事

这是数据

created_at               final_score  date
2018-09-07 03:22:10.753  63           2018-09-07
2018-09-06 11:31:10.312  17           2018-09-06
2018-09-06 02:53:40.136  79           2018-09-06
2018-09-07 00:49:07.007  61           2018-09-07
2018-09-06 12:42:41.523  64           2018-09-06
2018-09-06 08:23:32.121  56           2018-09-06
2018-09-05 13:15:16.082  58           2018-09-05
2018-09-06 06:57:19.128  39           2018-09-06
2018-09-06 09:00:56.311  60           2018-09-06
2018-09-05 23:59:22.213  42           2018-09-05

这是我的代码

df['date'] = df['timestamp'].dt.date
pivot_df = df.groupby(['date','score']).size().unstack(fill_value = 0).reset_index(),T
pivot_df = pivot_df.sort_values('date', ascending=False).T
pivot_df.columns = pivot_df.iloc[0]
pivot_df = pivot_df.iloc[1:]

这是结果

date         2018-09-07 2018-09-06  2018-09-05
final_score         
17           0          1           0
39           0          1           0
42           0          0           1
56           0          1           0
58           0          0           1
60           0          1           0
61           1          0           0
63           1          0           0
64           0          1           0
79           0          1           0

但是,我无法过滤

我正在尝试两种方法来选择一列

这是第一次尝试

输入

pivot_df['2018-09-07']

输出

  File "<ipython-input-61-4ac7906c5f54>", line 1
    pivot_df[2018-09-07]
                     ^
SyntaxError: invalid token

这是第二次尝试

输入

pivot_df[2018-09-07]

输出

KeyError: '2018-09-07'

我不知道过程中出了什么问题,所以我无法查询它们

2 个答案:

答案 0 :(得分:3)

您需要:

df.pivot_table(index='final_score',columns='date',aggfunc='count').fillna(0)
df.columns = df1.columns.levels[1].astype(str)

  date  2018-09-05  2018-09-06  2018-09-07
final_score         
17  0.0 1.0 0.0
39  0.0 1.0 0.0
42  1.0 0.0 0.0
56  0.0 1.0 0.0
58  1.0 0.0 0.0
60  0.0 1.0 0.0
61  0.0 0.0 1.0
63  0.0 0.0 1.0
64  0.0 1.0 0.0
79  0.0 1.0 0.0

df['2018-09-05']

final_score
17    0.0
39    0.0
42    1.0
56    0.0
58    1.0
60    0.0
61    0.0
63    0.0
64    0.0
79    0.0
Name: 2018-09-05, dtype: float64

答案 1 :(得分:1)

您的列是datetime对象而不是字符串存在问题。奇怪的是,为什么这些列不是DatetimeIndex对象(否则您所做的将行得通)。

您可以执行以下操作:

pivot_df.columns = pivot_df.columns.astype(str)

或者,

pivot_df.columns = pd.DatetimeIndex(pivot_df.columns)

现在,

pivot_df['2018-09-07']

final_score
17    0
39    0
42    0
56    0
58    0
60    0
61    1
63    1
64    0
79    0
Name: 2018-09-07, dtype: object

注意:即使您使用其他答案, 您也需要做同样的事情。