Python 如何在多索引数据帧中按组更新前N行中的值?
我试图更新多索引数据帧中的前N行,但在找到解决方案时遇到了一些困难,所以我想为它创建一个post 示例代码如下所示: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
# 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-这很有帮助。如果您只想更改一列的值怎么办?