2016-06-16 11 views
2

2つのcsvファイルがあります.1つはヘッダー付きの単一の列で、もう1つはヘッダー付きの複数の列です。私は、1つの列ファイルの値を検索し、他のファイルの同じヘッダーで列を検索します。一度一致するものが見つかると、その行全体を印刷します。私はこれがvlookup関数であることは分かっていますが、複数の列を持つcsvファイルは非常に大きく、これを達成するために数式を使用しようとすると常にクラッシュすることがあります。だから、私は解決策としてPythonを使用しようとしてきました。これを印刷しようとし別のcsvファイル内の1つのcsvファイルの値を検索し、行を出力します。

Name, age,number,AA,BB,CC,DD,EE 
John, 23, 1, 34,35,36,37,38 
Mary, 32, 2, 33,34,35,36,37 
Jacob , 43, 3, 32,33,34,35,36 
Matthew,22, 4, 31,32,33,34,35 
Jean, 18, 5, 30,31,32,33,34 

:このテーブルを検索

age 
23 
43 
18 

私はこのコラムを取っている私はこのコードを使用しようとしてきた

Name, age,number,AA,BB,CC,DD,EE 
John, 23, 1, 34,35,36,37,38 
Jacob , 43, 3, 32,33,34,35,36 
Jean, 18, 5, 30,31,32,33,34 

しかし、私はすべて混在して、最初の行を列として出力します:

with open('/home/s/Untitled 1.csv') as f: 
r=pandas.read_csv(f) 
with open('/home/s/Test1.csv','r') as w: 
    x=pd.read_csv(w) 
    col=w['age'] 
    for line in w: 
     for col in w: 
      for row in r: 
       if row in col: 
        print(line) 

私は、基本的に、クエリテーブルの最初のエントリを使用して、データテーブルの同じ見出しを持つ列を検索し、その行を印刷し、残りの行のエントリをループします。

アドバイスをいただければ幸いです!

答えて

2

非常に混乱していることを示すコードには多くの問題があります。

with open('/home/s/Untitled 1.csv') as f: 
    r = pandas.read_csv(f) 
with open('/home/s/Test1.csv','r') as w: 
    x = pandas.read_csv(w) 
    # w is not indexable 
    col = w['age'] 
    for line in w: 
     # w is not a table. 
     for col in w: 
      for row in r: 
       if row in col: 
        print(line) 

私はあなたのために問題を打破する場合、それが役立つだろうと思う:

  1. 最初のファイルを読み込み、年齢に
  2. を保存pandasデータフレーム
  3. における第二のファイルや店舗を読みます
  4. pandasのデータフレームをループして、年齢の一致を検索する

最初のファイルを読み込んで保存する

これは、データフレームの代わりにリストを使用して行うことができます。後でなぜあなたが見ることができます。

ages = [] 
with open("incsv1.csv", "r") as f: 
    r = pandas.read_csv(f) 
    ages = list(r["age"]) 

あなたはすでにそれを行っている第二のファイルを読み込み、パンダのデータフレームに

それを格納します。

with open("incsv2.csv", "r") as f: 
    x = pandas.read_csv(f) 

ループをパンダのデータフレームを通じて年齢や印刷マッチのマッチを見つけるために、

agesの列のみを調べることがわかっているので、その列にインデックスを付けて反復してください:

for i, age in enumerate(x["ages"]): 
    # You can't do this without a numpy int64 
    if age in ages: 
     print x.loc[i] 

プログラム全体の出力は以下となります。

Name  John 
age   23 
number  1 
AA   34 
BB   35 
CC   36 
DD   37 
EE   38 
Name: 0, dtype: object 
Name  Jacob 
age   43 
number   3 
AA   32 
BB   33 
CC   34 
DD   35 
EE   36 
Name: 2, dtype: object 
Name  Jean 
age   18 
number  5 
AA   30 
BB   31 
CC   32 
DD   33 
EE   34 
Name: 4, dtype: object 

良い方法今

、私はあなたはそれが直線でプリントアウトしたい知っているので、私は私が考えるものを紹介します多くの方が良いだろう。

import pandas 

ages = [] 
with open("incsv1.csv", "r") as f: 
    r = pandas.read_csv(f) 
    ages = list(r["age"]) 

with open("incsv2.csv", "r") as f: 
    # Skip the first line 
    f.readline() 
    for line in f: 
     if int(line.split(",")[1]) in ages: 
      print line, 

あなたが見ることができるように、あなたは本当にこの問題でpandasは必要ありません。実際には、私はそれを削除することができます:

ages = [] 
with open("incsv1.csv", "r") as f: 
    # Skip the first line 
    f.readline() 
    for line in f: 
     ages.append(int(line.strip("\n"))) 

with open("incsv2.csv", "r") as f: 
    # Skip the first line 
    f.readline() 
    for line in f: 
     if int(line.split(",")[1]) in ages: 
      print line, 
+0

うわー!それは速い反応でした!あなたの答えは非常に徹底的で、私は本当に混乱していました。だから基本的には、より良い方法では、データフレーム(ヘッダを切り捨てる)に年齢を格納してから、incsv2を読み込み、2番目の列のエントリが '年齢'になってその行を印刷するとしたら、 – Pythling

+0

はい、そうです。私はもう一つ言及するのを忘れていました:もしcsvファイルにスペースがあれば、 'pandas'はヘッダーをスペースで読み込みます。 –

関連する問題