简体   繁体   English

根据条件,熊猫更改组的第一个值

[英]Change first value of group based on condition, pandas

Assume that I have the following dataset 假设我有以下数据集

table = [[datetime.datetime(2015, 3, 31), 1, 0.5, 1],
         [datetime.datetime(2015, 6, 30), 1, 0.5, 0.5],
         [datetime.datetime(2015, 9, 30), 1, 0.5, 0.5],
         [datetime.datetime(2015, 12, 31), 1, 2, 0.5],
         [datetime.datetime(2015, 3, 31), 2, 0.5, 1.5],
         [datetime.datetime(2015, 6, 30), 2, 0.5, 0.5],
         [datetime.datetime(2015, 9, 30), 2, 0.5, 0.5],
         [datetime.datetime(2015, 12, 31), 2, 2, 0.5]]

df = pd.DataFrame(table, columns=['Date', 'Id', 'Value', 'Old'])

Is there any way to change the first element of Value to the corresponding element of Old if the element of Value is smaller than the one in Old ? 有没有什么办法的第一个元素更改Value到的相应元素Old如果的元素Value比一个较小的Old It needs to be done by each group (based on Id ). 它需要由每个组完成(基于Id )。 My new table would thus look like 我的新桌子看起来像

        Date  Id  Value  Old
0 2015-03-31   1    1.0  1.0
1 2015-06-30   1    0.5  0.5
2 2015-09-30   1    0.5  0.5
3 2015-12-31   1    2.0  0.5
4 2015-03-31   2    1.5  1.5
5 2015-06-30   2    0.5  0.5
6 2015-09-30   2    0.5  0.5
7 2015-12-31   2    2.0  0.5

Thanks, tingis 谢谢,丁吉斯

Since you only want to change the first element of each group, you can do a customized groupby apply function to do this. 由于您只想更改每个组的第一个元素,因此可以执行自定义的groupby应用功能。

import pandas as pd
import datetime

# your data
# =================================================
table = [[datetime.datetime(2015, 3, 31), 1, 0.5, 1],
         [datetime.datetime(2015, 6, 30), 1, 0.5, 0.5],
         [datetime.datetime(2015, 9, 30), 1, 0.5, 0.5],
         [datetime.datetime(2015, 12, 31), 1, 2, 0.5],
         [datetime.datetime(2015, 3, 31), 2, 0.5, 1.5],
         [datetime.datetime(2015, 6, 30), 2, 0.5, 0.5],
         [datetime.datetime(2015, 9, 30), 2, 0.5, 0.5],
         [datetime.datetime(2015, 12, 31), 2, 2, 0.5]]

df = pd.DataFrame(table, columns=['Date', 'Id', 'Value', 'Old'])

print(df)


        Date  Id  Value  Old
0 2015-03-31   1    0.5  1.0
1 2015-06-30   1    0.5  0.5
2 2015-09-30   1    0.5  0.5
3 2015-12-31   1    2.0  0.5
4 2015-03-31   2    0.5  1.5
5 2015-06-30   2    0.5  0.5
6 2015-09-30   2    0.5  0.5
7 2015-12-31   2    2.0  0.5

# processing
# ====================================
def func(group):
    if group.Value.values[0] < group.Old.values[0]:
        group.Value.values[0] = group.Old.values[0]
    return group

df.groupby('Id').apply(func)

        Date  Id  Value  Old
0 2015-03-31   1    1.0  1.0
1 2015-06-30   1    0.5  0.5
2 2015-09-30   1    0.5  0.5
3 2015-12-31   1    2.0  0.5
4 2015-03-31   2    1.5  1.5
5 2015-06-30   2    0.5  0.5
6 2015-09-30   2    0.5  0.5
7 2015-12-31   2    2.0  0.5

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM