2014-07-17 1 views
2

다중 인덱스 데이터 프레임에서 첫 번째 N 개의 행을 업데이트하려고하지만 솔루션을 찾는 데 어려움을 겪고 있었기 때문에이를위한 게시물을 만들 것이라고 생각했습니다. 다중 인덱스 팬더 데이터 프레임에서 그룹별로 처음 N 개 행의 값을 업데이트하는 방법?

# 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"로 설정하는 방법을 잘 모르겠어요 다음과 같이

예제 코드는 0과 같다. 아마도 내가 잘못된 방향으로 가고있는 것처럼 느껴질 것입니다. 어떤 도움이라도 대단히 감사하겠습니다. 감사!

답변

2

어떨까요? 먼저 데이터 프레임을 취하는 함수를 정의하고 처음 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 
+0

감사 chrisb/FOOBAR을, 이것은 내가 찾던 정확히 것입니다. FooBar뿐만 아니라 엄지의 규칙을 이해하십시오 - 도움이됩니다. – slee

1

일반적으로,보다는 단지 이들 만 선택을 할 수 있기 때문에 당신은 단지 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 
+0

한 열의 값만 변경하고 싶다면 어떻게해야합니까? – user1462620