팬더

2014-09-04 14 views
4

에서 안양의 병합하기 위해 DF 사전을 통해 반복 나는 반복 그들의 인덱스에 의해 그러나와 '내부'병합하려는 dataframes팬더

A = pd.DataFrame([[2, 1], [2, 1], [2, 1]], columns=['A', 'B'], index = [1, 2, 3]) 
B = pd.DataFrame([[1, 1], [2, 2], [3, 3]], columns=['A', 'B'], index = [1, 2, 3]) 
C = pd.DataFrame([[1, 2], [1, 2], [1, 2]], columns=['A', 'B'], index = [1, 2, 3]) 

df_all = {'df1': A, 'df2': B, 'df3': C} 

다음과 같은 사전은 루프를 사용했다. 그것은

df4 = pd.merge(A, B, left_index=True, right_index=True, how='inner') 
df5 = pd.merge(df4, C, left_index=True, right_index=True, how='inner') 

를하는 동등 할 것이다 그리고 그 결과는 보일 것이다 나는

for key, value in df_all.iteritems(): 
    df = pd.merge(value, value, left_index=True, right_index=True, how='inner') 

바보 같은 뭔가를 시도

A_x B_x A_y B_y A B 
1 2 1 1 1 1 2 
2 2 1 2 2 1 2 
3 2 1 3 3 1 2 

처럼 그러나 이것은 나에게 말도 안되는 결과를 제공합니다.

감사합니다.

+0

하는'pd.merge을 (시도 A, A, ...)'당신은 왜 결과 돈 보자 일하지 마라. – chrisaycock

+0

@chrisaycock 나는 왜 그들이 작동하지 않는지 압니다. 문제는 그 (것)들을 작동시키는 방법을 모른다이다. 모든 단서? – hernanavella

답변

6
import pandas as pd 
import functools 

A = pd.DataFrame([[2, 1], [2, 1], [2, 1]], columns=['A', 'B'], index = [1, 2, 3]) 
B = pd.DataFrame([[1, 1], [2, 2], [3, 3]], columns=['A', 'B'], index = [1, 2, 3]) 
C = pd.DataFrame([[1, 2], [1, 2], [1, 2]], columns=['A', 'B'], index = [1, 2, 3]) 

df_all = {'df1': A, 'df2': B, 'df3': C} 
merge = functools.partial(pd.merge, left_index=True, right_index=True, how='inner') 
df = functools.reduce(merge, df_all.values()) 
print(df) 

df_all.values()은 불특정 위해 dict의 값을 반환하는

A_x B_x A_y B_y A B 
1 2 1 1 2 1 1 
2 2 1 1 2 2 2 
3 2 1 1 2 3 3 

참고 산출한다. 당신이 특정 순서를 원하는 경우에, 당신은 당신이 pd.concat를 사용하여 계층 열이있는 DataFrame을 만들 수 있습니다 ... 키 정렬과 같은 일을 할


이 있거나 것 :

df = pd.concat(df_all, axis=1).dropna(axis=0) 
print(df) 

수율을

df1  df2  df3 
    A B A B A B 
1 2 1 1 1 1 2 
2 2 1 2 2 1 2 
3 2 1 3 3 1 2 

(경고 : pd.concat를 사용하여 깨지기 여기에 - 나는이 NaN 값이없는 DataFrames 있으리라 믿고있어,하지만 서로 다른 인덱스를 가질 수있다,727,467.3210은 내부 조인 생산하는 데 사용됩니다)

+0

많이 고마워!. 그것은 분명하지 않았습니다 ... – hernanavella

+0

df가 다른 인덱스 있습니다. concat 옵션은 좋은 대안입니다. 덕분에 – hernanavella

+0

대신 목록을 사용합니다. functools도 작동합니까? – hernanavella

2

CONCAT는 당신이 덮여했습니다.

In [11]: pd.concat([A, B, C], axis=1, keys=['df1', 'df2', 'df3']) 
Out[11]: 
    df1  df2  df3 
    A B A B A B 
1 2 1 1 1 1 2 
2 2 1 2 2 1 2 
3 2 1 3 3 1 2