[英]Applying iterative function to every group in pandas DataFrame
我有以下格式的大熊猫DataFrame:
prod_id timestamp text
150523 0006641040 9.393408e+08 text_1
150500 0006641040 9.408096e+08 text_2
150499 0006641041 1.009325e+09 text_3
150508 0006641041 1.018397e+09 text_4
150524 0006641042 1.025482e+09 text_5
DataFrame按prod_id
和timestamp
排序。 我想做的是根据最早到最新的timestamp
为每个prod_id
枚举一个计数器。 例如,我正在尝试实现以下目标:
prod_id timestamp text enum
150523 0006641040 9.393408e+08 text_1 1
150500 0006641040 9.408096e+08 text_2 2
150499 0006641041 1.009325e+09 text_3 1
150508 0006641041 1.018397e+09 text_4 2
150524 0006641042 1.025482e+09 text_5 1
通过遍历每一行并增加计数器,我可以很容易地迭代执行此操作,但是有没有办法以更实用的编程方式来执行此操作?
更新:
In [324]: df
Out[324]:
prod_id timestamp text
150523 6641040 9.393408e+08 text_1
150500 6641040 9.408096e+08 text_2
150501 6641040 9.408096e+08 text_3
150499 6641041 1.009325e+09 text_3
150508 6641041 1.018397e+09 text_4
150524 6641042 1.025482e+09 text_5
In [325]: df['enum'] = df.groupby(['prod_id'])['timestamp'].cumcount() + 1
In [326]: df
Out[326]:
prod_id timestamp text enum
150523 6641040 9.393408e+08 text_1 1
150500 6641040 9.408096e+08 text_2 2
150501 6641040 9.408096e+08 text_3 3
150499 6641041 1.009325e+09 text_3 1
150508 6641041 1.018397e+09 text_4 2
150524 6641042 1.025482e+09 text_5 1
旧答案:
In [314]: df['enum'] = df.groupby(['prod_id'])['timestamp'].rank().astype(int)
In [315]: df
Out[315]:
prod_id timestamp text enum
150523 6641040 9.393408e+08 text_1 1
150500 6641040 9.408096e+08 text_2 2
150499 6641041 1.009325e+09 text_3 1
150508 6641041 1.018397e+09 text_4 2
150524 6641042 1.025482e+09 text_5 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.