2016-07-22 5 views
0

내가 파이썬에서, 분명히, 간단한 조작을 할 노력하고있어 일치 :팬더는 : 열 값의 경우 합계는

내가 어떤 데이터 세트를 6 말, 나는 값의 경우 하나 개의 컬럼의 값을 합계를 다른 두 열 중 하나가 일치합니다. 그 후, 필자는 가지고있는 데이터 세트의 수,이 경우 6 (즉, 산술 평균 계산)으로 합산 한 열의 값을 나누고 싶습니다. 또한 다른 열의 값이 일치하지 않으면 0 합계 싶습니다.

I는 예를 들어, 여기에서 두 dataframes 적어 :

Code1 Code2 Distance 0 15.0 15.0 2 1 15.0 60.0 3 2 15.0 69.0 2 3 15.0 434.0 1 4 15.0 842.0 0

Code1 Code2 Distance 0 14.0 15.0 4 1 14.0 60.0 7 2 15.0 15.0 0 3 15.0 60.0 1 4 15.0 69.0 9

첫번째 열은 df.index 열이다. 그런 다음 'Code1'과 'Code2'열이 일치하는 경우에만 '거리'열을 더하고 싶습니다. 나는이 사용하는 조건문을하려고 노력하지만, 두 개 이상의 DF 위해 할 정말 어렵습니다

Code1 Code2 Distance 0 14.0 15.0 2 1 14.0 60.0 3.5 2 15.0 15.0 1 3 15.0 60.0 2 4 15.0 69.0 5.5 5 15.0 434.0 0.5 6 15.0 842.0 0

이 경우 원하는 출력 뭔가처럼 될 것입니다. 팬더에서 더 빨리 할 수있는 방법이 있습니까?

어떤 도움

당신은 목록에있는 모든 데이터 프레임을 넣고 append 또는 merge 모두 하나에 reduce를 사용할 수

+0

은'Code1'과'Code2' 한 dataframe에 따라 변경 될 수 있을까? –

+0

Code1과 Code2가 서로 일치하면 Distance col의 값을 추가하겠습니까? 국방부 사이에? 색인의 부류? 또한, 만약 당신이 N DataFrames 모든 열이 왜 당신은 단지 모든 데이터와 함께 큰 DF를 만들 수 없다고 합계 col 같은 조건을 사용할 수 있습니까? – nico

+0

@AntonProtopopov, 예, 동일 할 수 있습니다. –

답변

1

:-) 감사하겠습니다. 줄이면 here을보십시오.

먼저 샘플 데이터 생성을 위해 일부 기능이 정의됩니다.

import pandas 
import numpy as np 

# GENERATE DATA 
# Code 1 between 13 and 15 
def generate_code_1(n): 
    return np.floor(np.random.rand(n,1) * 3 + 13) 

# Code 2 between 1 and 1000 
def generate_code_2(n): 
    return np.floor(np.random.rand(n,1) * 1000) + 1 

# Distance between 0 and 9 
def generate_distance(n): 
    return np.floor(np.random.rand(n,1) * 10) 

# Generate a data frame as hstack of 3 arrays 
def generate_data_frame(n): 
    data = np.hstack([ 
     generate_code_1(n) 
     ,generate_code_2(n) 
     ,generate_distance(n) 
    ]) 
    df = pandas.DataFrame(data=data, columns=['Code 1', 'Code 2', 'Distance']) 
    # Remove possible duplications of Code 1 and Code 2. Take smallest distance in case of duplications. 
    # Duplications will break merge method however will not break append method 
    df = df.groupby(['Code 1', 'Code 2'], as_index=False) 
    df = df.aggregate(np.min) 
    return df 

# Generate n data frames each with m rows in a list 
def generate_data_frames(n, m, with_count=False): 
    df_list = [] 
    for k in range(0, n): 
     df = generate_data_frame(m) 
     # Add count column, needed for merge method to keep track of how many cases we have seen 
     if with_count: 
      df['Count'] = 1 
     df_list.append(df) 
    return df_list 

추가] 방법 (더 빨리, 더 짧은, 더 좋은)

df_list = generate_data_frames(94, 5) 

# Append all data frames together using reduce 
df_append = reduce(lambda df_1, df_2 : df_1.append(df_2), df_list) 

# Aggregate by Code 1 and Code 2 
df_append_grouped = df_append.groupby(['Code 1', 'Code 2'], as_index=False) 
df_append_result = df_append_grouped.aggregate(np.mean) 
df_append_result 

병합 방법

df_list = generate_data_frames(94, 5, with_count=True) 

# Function to be passed to reduce. Merge 2 data frames and update Distance and Count 
def merge_dfs(df_1, df_2): 
    df = pandas.merge(df_1, df_2, on=['Code 1', 'Code 2'], how='outer', suffixes=('', '_y')) 
    df = df.fillna(0) 
    df['Distance'] = df['Distance'] + df['Distance_y'] 
    df['Count'] = df['Count'] + df['Count_y'] 
    del df['Distance_y'] 
    del df['Count_y'] 
    return df 

# Use reduce to apply merge over the list of data frames 
df_merge_result = reduce(merge_dfs, df_list) 

# Replace distance with its mean and drop Count 
df_merge_result['Distance'] = df_merge_result['Distance']/df_merge_result['Count'] 
del df_merge_result['Count'] 
df_merge_result