2017-11-20 4 views
3

DataFrame 하나의 열에 대해 서로 다른 행이 동일한 값을 가질 수 있습니다. 일례로서
:DataFrame을 DataFrame으로 분할하기

여기
import pandas as pd 
df = pd.DataFrame({ 
    "Name" : ["Alice", "Bob", "John", "Mark", "Emma" , "Mary"] , 
    "City" : ["Seattle", "Seattle", "Portland", "Seattle", "Seattle", "Portland"] }) 

    City  Name 
0 Seattle Alice 
1 Seattle Bob 
2 Portland John 
3 Seattle Mark 
4 Seattle Emma 
5 Portland Mary 

여러 행에 의해 공유되는 "도시"(예컨대 "포틀랜드 ')에 대해 소정의 값.

이 데이터 프레임에서 하나의 열 값을 공통으로 갖는 여러 데이터 프레임을 만들고 싶습니다. 위의 예를 들어, 나는 다음과 같은 데이터 프레임 싶어 :

 City  Name 
0 Seattle Alice 
1 Seattle Bob 
3 Seattle Mark 
4 Seattle Emma 

answer에서

 City  Name 
2 Portland John 
5 Portland Mary 

을, 나는 하나 개의 데이터 프레임을 생성하는 데 사용할 수있는 마스크를 만드는 오전 :

def mask_with_in1d(df, column, val): 
    mask = np.in1d(df[column].values, [val]) 
    return df[mask] 

# Return the last data frame above 
mask_with_in1d(df, 'City', 'Portland') 

문제는 이름이 할당되는 모든 데이터 프레임을 효율적으로 만드는 것입니다.

unique_values = np.sort(df['City'].unique()) 
for city_value in unique_values: 
    exec("df_{0} = mask_with_in1d(df, 'City', '{0}')".format(city_value)) 

내가 더 조작 할 수 df_Seattledf_Portland 프레임 나에게 데이터를 제공합니다 나는 이런 식으로 일을하고 있습니다.

더 좋은 방법이 있나요?

+0

재현 가능한 질문. 고마워. – Kanak

답변

4

이 작업을 수행 할 도시 목록이 고정 되었습니까? 간단한 해결책은 도시에서 그룹과 다음 그룹

for city, names in df.groupby("City"): 
    print(city) 
    print(names) 

Portland 
     City Name 
2 Portland John 
5 Portland Mary 
Seattle 
     City Name 
0 Seattle Alice 
1 Seattle Bob 
3 Seattle Mark 
4 Seattle Emma 

이상 루프는 다음 작업을 df_city["Portland"]을 원하는 경우 사전 또는 일부 등 (df_city[city] = names)에 할당 할 수 있습니다. 한 번 나누어 진 그룹에 따라 원하는대로 달려 있습니다.

+0

고마워, 확실히 청소부. 데이터 프레임의 모든 고유 한 도시 값에 대해이 작업을 수행합니다. 사전을 만드는 것이 나의 유스 케이스에 대한 최선의 접근 방법이 될 것이다. – unfolx

2

이에 대한 groupby을 사용할 수 있습니다

dfs = [gb[1] for gb in df.groupby('City')] 

이 dataframes의 'City' 열의 값 당 하나의 목록을 구성합니다.

이 경우 당신은 dataframe의 값을 갖는 튜플, 당신은 사용할 수 있습니다 원하는 이름으로 지정하는 것은 일반적으로 안티 패턴입니다

dfs = list(df.groupby('City')) 

합니다. 그리고 execeval은 분명히 반 패턴입니다.

+0

감사합니다. 출력 데이터 구조 측면에서 이러한 대안에 대해 알고 기쁩니다. 나는 내가하고있는 내 코드가 아닌 다른 코드에서'exec'에 대해 배웠다. 이것이 일반적으로 피해야한다는 것을 잘 알고 있습니다. (이 안티 패턴 [작은 책] (https://docs.quantifiedcode.com/python-anti-patterns/)을 찾아 볼 가치가있는 것 같습니다.) – unfolx

관련 문제