Python 如何在多索引数据帧中按组更新前N行中的值?

Python 如何在多索引数据帧中按组更新前N行中的值?,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,我试图更新多索引数据帧中的前N行,但在找到解决方案时遇到了一些困难,所以我想为它创建一个post 示例代码如下所示: # Imports import numpy as np import pandas as pd # Set Up Data Frame dates = pd.date_range('1/1/2000', periods=8) df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D']) df['D

我试图更新多索引数据帧中的前N行,但在找到解决方案时遇到了一些困难,所以我想为它创建一个post

示例代码如下所示:

# Imports
import numpy as np
import pandas as pd

# Set Up Data Frame
dates = pd.date_range('1/1/2000', periods=8)
df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])
df['DATE'] = dates
df['CATEGORY'] = ['A','B','A','B','A','B','A','B']

# Set Index
df.set_index(['CATEGORY','DATE'],inplace=True)
df.sort(inplace=True)

# Get First Two Rows of Each Category
df.groupby(level=0).apply(lambda x: x.iloc[0:2])

# Set The Value of Column 'C' Equal to Zero
# ???

因此,我可以使用“iloc”选择行,但之后我不确定如何将列“C”设置为零。我觉得我可能走错了方向。任何帮助都将不胜感激。谢谢

如何-首先定义一个函数,该函数接受一个数据帧,并用指定的值替换第一个x记录

def replace_first_x(group_df, x, value):
    group_df.iloc[:x, :] = value
    return group_df
然后,使用apply将其传递到
groupby
对象中

In [97]: df.groupby(level=0).apply(lambda df: replace_first_x(df, 2, 9999))
Out[97]: 
                               A            B            C            D
CATEGORY DATE                                                          
A        2000-01-01  9999.000000  9999.000000  9999.000000  9999.000000
         2000-01-03  9999.000000  9999.000000  9999.000000  9999.000000
         2000-01-05     1.590503     0.948911    -0.268071     0.622280
         2000-01-07    -0.493866     1.222231     0.125037     0.071064
B        2000-01-02  9999.000000  9999.000000  9999.000000  9999.000000
         2000-01-04  9999.000000  9999.000000  9999.000000  9999.000000
         2000-01-06     1.663430    -1.170716     2.044815    -2.081035
         2000-01-08     1.593104     0.108531    -1.381218    -0.517312

通常,当您必须更改值而不是仅拾取值时,您无法仅使用
lambda
函数继续操作,因为这些函数仅允许选择

一个非常简单的方法是

def replace_first(group):
    group.iloc[0:2] = 99
    return group
然后就这么做

In[144]: df.groupby(level=0).apply(replace_first)
Out[144]: 
                             A          B          C          D
CATEGORY DATE                                                  
A        2000-01-01  99.000000  99.000000  99.000000  99.000000
         2000-01-03  99.000000  99.000000  99.000000  99.000000
         2000-01-05   0.458031   1.959409   0.622295   0.959019
         2000-01-07   0.934521  -2.016685   1.046456   1.489070
B        2000-01-02  99.000000  99.000000  99.000000  99.000000
         2000-01-04  99.000000  99.000000  99.000000  99.000000
         2000-01-06  -0.117322  -1.664436   1.582124   0.486796
         2000-01-08  -0.225379   0.794846  -0.021214  -0.510768

谢谢chrisb/FooBar,这正是我想要的。欣赏经验法则以及FooBar-这很有帮助。如果您只想更改一列的值怎么办?