我有一个数据框:
+----------------+--------------+------------+
| TransactionID | TimeKey | ProductKey |
+----------------+--------------+------------+
| 3621015 | '2018-01-01' | 6151 |
| 3621015 | '2018-01-01' | 4354 |
| 3487373 | '2018-01-02' | 6151 |
| 4378337 | '2018-01-03' | 6151 |
| 4378337 | '2018-01-03' | 4354 |
| 4378337 | '2018-01-03' | 3783 |
+----------------+--------------+------------+
它是一个关于交易及其各自日期以及购买的产品的数据库
我想计算每一行某个产品出现的次数。 大概是这样的:
+----------------+--------------+------------+-------+
| TransactionID | TimeKey | ProductKey | count |
+----------------+--------------+------------+-------+
| 3621015 | '2018-01-01' | 6151 | NaN/0 |
| 3621015 | '2018-01-01' | 4354 | NaN/0 |
| 3487373 | '2018-01-02' | 6151 | 1 |
| 4378337 | '2018-01-03' | 6151 | 2 |
| 4378337 | '2018-01-03' | 4354 | 1 |
| 4378337 | '2018-01-03' | 3783 | NaN/0 |
+----------------+--------------+------------+-------+
现在我可以做,但是我做的方式很糟糕。 我的解决方案:
for index, row in data.iterrows():
data['count'] = data[(data['ProductKey'] == row['ProductKey']) & (data['TimeKey'] <= row['TimeKey'])]['ProductKey'].count()
这样做30行是可以的,但我正在与一对夫妇houndred千行:\寻找想法
data['Count'] = data.groupby(['ProductKey'])['ProductKey'].count()
这将提供每个ProductKey的计数。如果不希望计数为NaN,请运行以下代码段
data.fillna(value = 0, inplace = True)
假设您的
TimeKey
已经像在示例中一样处于递增顺序,您需要groupby
和cumcount
如下所示注意:如果
TimeKey
的顺序不是递增的,则需要在运行上面的命令之前按它对数据帧进行排序。如果您对其进行排序,则需要以正确的日期时间格式进行排序相关问题 更多 >
编程相关推荐