2015-01-31 2 views
0

첫 번째 데이터 프레임에서 마지막 두 열 (shift_one 및 shift_two)은 잠재적 인 실제 좌표를 추측하는 것으로 볼 수 있습니다. 이 df1이라고 부르십시오.Pandas Datframe1에서 Dataframe2의 범위에서 일치 검색

DF1 : 제 dataframe에서

  p_one  p_two   dist shift_one shift_two 
0  Q8_CB  Q2_C d_6.71823_Angs  26.821 179.513 
1  Q8_CD  Q2_C d_4.72003_Angs 179.799 179.514 
.... 

이 DF2를 호출 내가 피크를 나타내는 실험 관찰 좌표 dataframe있다. 신호가 얼마나 강렬한 지 좌표와 하나의 열만 있으면됩니다. 이것은 타고 가야합니다.

DF2 : 나는 DF1의 각 추측하는 방법을 가지고하는 것을 목표로하고

  A  B  C 
0  31.323 25.814 251106 
1  26.822 26.083 690425 
2  27.021 179.34 1409596 
3  54.362 21.773 1413783 
4  54.412 20.163 862750 
.... 

을 조회 할/검색/DF1의 초기 추측의 0.300의 범위 내에서, DF2에 refrenced. 그런 다음 이것을 새로운 datframe으로 반환하고 싶습니다. df3을 말하십시오. 이 경우 df1의 행 0과 일치하는 이 df2의 행 2와 일치합니다 ().

원하는 출력, DF3 : 나는 몇 가지를 시도

  p_one  p_two   dist shift_one shift_two match match1 match2 match_inten 
0  Q8_CB  Q2_C d_6.71823_Angs  26.821 179.513 TRUE 27.021 179.34  1409596 
1  Q8_CD  Q2_C d_4.72003_Angs 179.799 179.514 NaN  NaN  NaN   NaN 
.... 

:

(1) 오라일리는 람다를 사용하여 파이썬에서 목록의 범위를 다루는 시사 또는 def (한 마디로 파이썬의 p78). 그래서 나는 이와 같은 바운드 함수를 정의합니다.

def bounds (value, l=low, h=high) 

그때 난 그냥 여기에 사용되는 로직 (https://stackoverflow.com/a/14717374/3767980) 다음, 새 열을 추가 할 수 있다고 생각했다.

df1['match'] = ((df2['A'] + 0.3 <= df1['shift_one']) or (df2['A'] + 0.3 => df1['shift_one']) 

-은 정말 사소한해야이 문

다음 그냥 뺄 값과 사투를 벌인거야.

(2) 상한 및 하한에 대해 새 열을 만든 다음 조건이 두 열 사이에 있는지 확인하십시오.

마지막 :

(가) 당신은 내가 판다를 유지해야한다고 생각합니까? 또는 NumPy 또는 SciPy 또는 전통적인 Python 배열/목록으로 이동해야합니다. 나는 규칙적인 파이썬이 목록의 목록도 가지고 있다고 생각하고 있었다. NumPy가 텍스트를 가지고 있기 때문에 두려워요. NumPy는 숫자/행렬에만 사용됩니다.

(b) 어떤 도움을 주시면 감사하겠습니다. phase_one과 phase_two에 대해 biopython을 사용했고, phase_three에 대한 팬더를 사용했으며,이 최종 단계에서는 사용할 최고의 라이브러리가 무엇인지 잘 모릅니다.

(c) 아마도 내가 아마추어 프로그래머라는 것은 꽤 분명합니다.

+1

을 생산 "NumPy와 숫자에 독점/매트릭스 전용"- 아니. 레코드/구조화 된 배열은 데이터 프레임과 같이 형식이 다른 열을 가질 수 있습니다. –

+0

솔루션의 형식을 이해하지 못합니다. df1의 각 행은 df2에서 최대 1 개의 행과 만 일치합니까? – Alex

+0

예, 정확합니다. df2는 엄청나게 크며 극적으로 큽니다. 두 숫자 값이 각각 해당 항목의 0.3의 허용 오차 내에있는 일치 항목을 찾고 있습니다. 그런 다음 일치도와 해당 허용치를 모두 충족하는 두 값의 인쇄본을 반환합니다. – PhysicalChemist

답변

1

다음은 비교할 열이 동일한 이름을 가진다고 가정합니다.

def temp(row): 
    index = df2[((row-df2).abs() < .3).all(axis=1)].index 
    return df2.loc[index[0], :] if len(index) else [None]*df2.shape[1] 

예.

df1 = pd.DataFrame([[1,2],[3,4], [5,6]], columns=["d1", "d2"]) 
df2 = pd.DataFrame([[1.1,1.9],[3.2,4.3]], columns=["d1", "d2"]) 
df1.apply(temp, axis=1) 

d1 d2 
0 1.1 1.9 
1 3.2 4.3 
2 NaN NaN 
+0

고맙습니다.이 스크립트는 매우 유용하며 스크립트를 실행하고 있습니다. – PhysicalChemist

+0

@PhysicalChemist 훌륭한! 다행 그것은 문제를 해결 :) – Alex