2013-08-31 7 views
1

이 간단한 문제를 광범위하게 조사했지만 대답을 찾을 수 없습니다. 두 개의 파일을 pandas 'pd.merge "JN"이라는 공통 열을 기반으로 병합하려고합니다. 데이터 프레임/csv 파일 대신 문자열로 내 'joined'(os.path.join) 파일 이름을 처리하고 있다고 생각합니다. pd.merge 함수를 호출하면 "문자열 인덱스는 str이 아닌 정수 여야합니다."라는 오류 메시지가 표시됩니다. 나는 그것이 실제 파일이나 dataframe로 내 파일 이름 문자열을 읽을 수 있도록하는 방법을 궁금Pandas pd.merge "TypeError : 문자열 인덱스는 str이 아닌 정수 여야합니다."

TypeError: string indices must be integers, not str 

: 위의 pd.merge 함수 호출과 관련된에서

import pandas as pd 
import os 

path = r"C:/Users/St/Documents/House/m2" 

dirs = os.listdir(path) 

for file in dirs: 
    if file.endswith("J.csv"): 
     J = file 
     if len(J) is 12: #some filenames are 12 chars others 11 
      jroot = J[:7] 
     else: 
      jroot = J[:6] 

for file in dirs: 
    if file.endswith("2.csv"): 
     W = file 
     if len(W) is 12: 
      root2 = W[:7] 
     else: 
      root2 = W[:6] 

JJ = os.path.join(path, J) 
WW = os.path.join(path, W) 

if jroot == root2:   # if the first 7 (or 6) characters match, then merge 
    JW = pd.merge(JJ, WW, on="JN") 

, 나는이 오류를 얻고있다. JJ 및 WW는 인쇄 할 때 전체 경로와 동일합니다. 나는 pd.DataFrame을 사용하여 이러한 '파일 이름'dataFrames를 만들려고했으나 그렇게 할 수 없었습니다.

답변

2

두 문자열은 merge 수 없습니다. 나는 당신이 os.path.join이 반환하는 것에 대해 혼란 스럽다고 생각합니다. 문자열을 반환합니다. 실제로 JJWW이라는 파일에서 DataFrame을 읽은 다음 merge을 수행해야합니다. 다른 것들의

In [49]: df1 = DataFrame(randn(10, 1), columns=['a']) 

In [50]: df1['group'] = np.random.choice(['b', 'c'], size=len(df1)) 

In [51]: df2 = DataFrame(randn(10, 1), columns=['b']) 

In [52]: df2['group'] = np.random.choice(['b', 'c'], size=len(df1)) 

In [53]: df1.to_csv('df1.csv', index=False) 

In [54]: cat df1.csv 
a,group 
-1.590035935931282,b 
0.5496398501891229,c 
-0.6484689548035797,b 
0.19162302248253205,b 
-0.9852064283582675,c 
0.5975155551821989,b 
0.29443634291217047,b 
-0.7929994157215382,b 
-1.9546460886048795,b 
0.19195457928475546,c 

In [55]: df2.to_csv('df2.csv', index=False) 

In [56]: cat df2.csv 
b,group 
-1.2874060006117918,c 
1.1037959548210117,b 
0.47172389260467507,c 
0.12802538607490285,c 
-0.8753708425917293,b 
-0.09187827793091947,b 
1.140204215271196,c 
0.4862940170888638,b 
-1.1080430563137758,b 
-1.3698112665693232,c 

In [57]: df1_csv = read_csv('df1.csv', index_col=None) 

In [58]: df2_csv = read_csv('df2.csv', index_col=None) 

In [59]: df1_csv 
Out[59]: 
     a group 
0 -1.590  b 
1 0.550  c 
2 -0.648  b 
3 0.192  b 
4 -0.985  c 
5 0.598  b 
6 0.294  b 
7 -0.793  b 
8 -1.955  b 
9 0.192  c 

In [60]: df2_csv 
Out[60]: 
     b group 
0 -1.287  c 
1 1.104  b 
2 0.472  c 
3 0.128  c 
4 -0.875  b 
5 -0.092  b 
6 1.140  c 
7 0.486  b 
8 -1.108  b 
9 -1.370  c 

In [61]: df3 = pd.merge(df1_csv, df2_csv, on='group') 

In [62]: df3 
Out[62]: 
     a group  b 
0 -1.590  b 1.104 
1 -1.590  b -0.875 
2 -1.590  b -0.092 
3 -1.590  b 0.486 
4 -1.590  b -1.108 
5 -0.648  b 1.104 
6 -0.648  b -0.875 
7 -0.648  b -0.092 
8 -0.648  b 0.486 
9 -0.648  b -1.108 
10 0.192  b 1.104 
11 0.192  b -0.875 
12 0.192  b -0.092 
13 0.192  b 0.486 
14 0.192  b -1.108 
15 0.598  b 1.104 
16 0.598  b -0.875 
17 0.598  b -0.092 
18 0.598  b 0.486 
19 0.598  b -1.108 
20 0.294  b 1.104 
21 0.294  b -0.875 
22 0.294  b -0.092 
23 0.294  b 0.486 
24 0.294  b -1.108 
25 -0.793  b 1.104 
26 -0.793  b -0.875 
27 -0.793  b -0.092 
28 -0.793  b 0.486 
29 -0.793  b -1.108 
30 -1.955  b 1.104 
31 -1.955  b -0.875 
32 -1.955  b -0.092 
33 -1.955  b 0.486 
34 -1.955  b -1.108 
35 0.550  c -1.287 
36 0.550  c 0.472 
37 0.550  c 0.128 
38 0.550  c 1.140 
39 0.550  c -1.370 
40 -0.985  c -1.287 
41 -0.985  c 0.472 
42 -0.985  c 0.128 
43 -0.985  c 1.140 
44 -0.985  c -1.370 
45 0.192  c -1.287 
46 0.192  c 0.472 
47 0.192  c 0.128 
48 0.192  c 1.140 
49 0.192  c -1.370 

커플 :

is를 사용하지 마십시오 여기

는 열 group에 그들을 병합 후, 2 개 DataFrame의를 작성 read_csv으로 그들을 다시 읽기의 전체 예제 객체가 동일한 지 비교하려면 ==을 사용하십시오. 작은 정수의 경우에만 이것이 안정적으로 작동 할 것이며 CPython의 구현 세부 사항이기 때문에 신뢰할 수는 없습니다. 대신 str.endswith와 파일 이름을 확인하는

, 당신이 먼저 대체 (globbing)에 의해 원하는 것을 반복 :

import glob 

for f in glob.glob(os.path.join(path, '*J.csv')): 
    if len(f) == 12: 
     # do all the thingz! 
+0

감사합니다 ... 나는 이것을 시도 할 것이다. 아직도 신참 그래서 내 코드를 더 유선형/더 높이 평가할 수있는 모든 팁! – 5tanczak

관련 문제