Python 根据条件更改组的第一个值

Python 根据条件更改组的第一个值,python,pandas,Python,Pandas,假设我有以下数据集 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.

假设我有以下数据集

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'])
如果
Value
的元素小于
Old
中的元素,是否有办法将
Value
的第一个元素更改为
Old
的对应元素?这需要由每个组完成(基于
Id
)。因此,我的新桌子看起来像

        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

谢谢,tingis

因为您只想更改每个组的第一个元素,所以可以使用自定义的groupby apply函数来完成此操作

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
将熊猫作为pd导入
导入日期时间
#你的数据
# =================================================
表=[[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(表,列=['Date','Id','Value','Old'])
打印(df)
日期Id值旧
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
#加工
# ====================================
def func(集团):
如果group.Value.values[0]
第一个元素?如果只想对元素0进行操作,实际上不需要任何特殊的函数。只是
df.ix[0]['Value']>df.ix[0]['Old']
我感觉你的问题并不能解释你的整个情况。啊,我想我忘了在实际问题中提到它,只是在标题中——我需要为每个组
Id
,在问题中添加了它。很抱歉,问题不清楚,您是如何确定分组依据
id
?问题中没有写这句话,再次感谢@Jianxun,我希望你今天能在线@firelynx中只有两个值在post中更改,并且对于每个
Id
集群,这两个值都位于第一个值的位置。另外,Tingiskhan已经发布了一些关于这个示例数据框架的问题,因此我对其结构非常熟悉。