2017-02-13 3 views
2

Предположим, у нас есть файл CSVкак использовать питона список понимание/словарь для печати каждого столбца в качестве уникальной переменной

PROPERTY_ID,CLIENT_ID,FROM_YEAR 
1,5,2015 
2,6,2015 
3,9,2015 
4,9,2015 

Я пытаюсь передать каждое уникальное сочетание CLIENT_ID, PROPERTY_ID, FROM_YEAR в словарь или список , так что я могу поместить каждую пару "PROPERTY_ID, CLIENT_ID, FROM_YEAR" в запросах MySQL:

SELECT * FROM client_5 WHERE PROPERTY_ID = 1 and FROM_YEAR = 2015; 

SELECT * FROM client_6 WHERE PROPERTY_ID = 2 and FROM_YEAR = 2015; 

SELECT * FROM client_9 WHERE PROPERTY_ID = 3 and FROM_YEAR = 2015; 

SELECT * FROM client_9 WHERE PROPERTY_ID = 4 and FROM_YEAR = 2015; 

с переменной точки зрения:

1st round: 
$CLIENT_ID,$PROPERTY_ID,$FROM_YEAR=5,1,2015 

2nd round 
$CLIENT_ID,$PROPERTY_ID,$FROM_YEAR=6,2,2015 

3rd round 
$CLIENT_ID,$PROPERTY_ID,$FROM_YEAR=9,3,2015 

4th round 
$CLIENT_ID,$PROPERTY_ID,$FROM_YEAR=9,4,2015 

Я пытался использовать список понимание:

df = pd.read_csv("test.csv") 

df2=df.apply(tuple, 1).unique().tolist() 

for CLIENT_ID in [x[0] for x in df2]: 

    CLIENT_ID=CLIENT_ID.astype('str') 

    print "SELECT * FROM client"+CLIENT_ID 

    for PROPERTY_CODE in [y[1] for y in df2]: 

     PROPERTY_CODE=PROPERTY_CODE.astype('str') 

     print "WHERE PROPERTY_ID = "+PROPERTY_CODE 

возвращает следующее, что не мы ищем:

SELECT * FROM client_5 
WHERE FK_PROPERTY_ID = 1 
WHERE FK_PROPERTY_ID = 2 
WHERE FK_PROPERTY_ID = 3 
WHERE FK_PROPERTY_ID = 4 

Может кто просветит? Благодарю.

+0

Почему вы используете 'pandas'? Только для анализа CSV? –

+0

Просто перебирайте кадр данных, создавайте свои запросы и добавляйте их в заранее установленный 'set'. Когда вы закончите создание запросов, вы выполните их. «Set» устраняет дубликаты. –

ответ

2

Это будет работать для вас: -

import csv 

with open('fileName.csv') as f: 
    reader = csv.reader(f) 
    next(reader, None) 
    for row in reader: 

     #print row 
     print """SELECT * FROM client_%s WHERE PROPERTY_ID = %s and FROM_YEAR = %s;"""%(row[1],row[0],row[2]) 
+0

Лучше вручную записать заголовок в начале 'head = next (row)' перед использованием for-loop, вместо того, чтобы добавлять крючок внутри цикла, который замедляет каждую итерацию. Несмотря на это, я думаю, что использование модуля 'csv' - это путь сюда. –

+1

Спасибо, спасибо. –

+0

Модуль csv в этом случае проще. Я думаю, что в этом случае я слишком сильно ставил свою голову в панды, и это становится кроличьей дырой. Ответ на самом деле очень простой>. <. Спасибо, что просветил меня! – Chubaka

3

Я хотел бы использовать format

fstr = '$CLIENT_ID,$PROPERTY_ID,$FROM_YEAR={CLIENT_ID},{PROPERTY_ID},{FROM_YEAR}' 
df.drop_duplicates().apply(lambda x: fstr.format(**x), 1) 

0 $CLIENT_ID,$PROPERTY_ID,$FROM_YEAR=5,1,2015 
1 $CLIENT_ID,$PROPERTY_ID,$FROM_YEAR=6,2,2015 
2 $CLIENT_ID,$PROPERTY_ID,$FROM_YEAR=9,3,2015 
3 $CLIENT_ID,$PROPERTY_ID,$FROM_YEAR=9,4,2015 
dtype: object 
3

Я думаю, что вы можете использовать apply с set и list:

L = list(set(df.apply(lambda x: 'SELECT * FROM client_{} WHERE PROPERTY_ID = {} and FROM_YEAR = {};'.format(x['CLIENT_ID'], x['PROPERTY_ID'], x['FROM_YEAR']),1))) 

print (L) 
['SELECT * FROM client_5 WHERE PROPERTY_ID = 1 and FROM_YEAR = 2015;', 
'SELECT * FROM client_9 WHERE PROPERTY_ID = 3 and FROM_YEAR = 2015;', 
'SELECT * FROM client_9 WHERE PROPERTY_ID = 4 and FROM_YEAR = 2015;', 
'SELECT * FROM client_6 WHERE PROPERTY_ID = 2 and FROM_YEAR = 2015;'] 
2

Это легко реализовать с помощью метода .format:

import pandas as pd 

df = pd.read_csv('test.csv') 
rows = df.apply(tuple, 1).unique().tolist() 

for (prop_id, client_id, year) in rows: 
    print("SELECT * FROM client_{client_id} WHERE property_id = {prop_id} AND from_year = {year}".format(
     prop_id=prop_id, 
     client_id=client_id, 
     year=year 
    )) 

В Python 3.6 вы можете использовать интерполяцию строки:

for (prop_id, client_id, year) in rows: 
    print(f"SELECT * FROM client_{client_id} WHERE property_id = {prop_id} AND from_year = {year}")