Два CSV-файла, сопоставляют пару из строки с совпадающими значениями во 2-м CSV-файле, в одном столбце, состоящем из значений одного типа - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть два CSV-файла, и я хотел бы сопоставить пару (набор из двух) значений int одного и того же типа из строки (от l oop до n строк) с соответствующими значениями во 2-м CSV-файле, в одном столбце, состоящем из повторяющихся значений одного и того же типа.

Пока что я написал этот код, но он занимает очень много времени, может быть, есть pythoni c сокращения для этой проблемы?

c1=0
c2=0

def append_list_as_row(file_name, list_of_elem):
    # Open file in append mode
    with open(file_name, 'a+', newline='') as write_obj:
        # Create a writer object from csv module
        csv_writer = writer(write_obj)
        # Add contents of list as last row in the csv file
        csv_writer.writerow(list_of_elem)

pairs = pd.read_csv('pairs.csv',delimiter=';')
df = pd.read_csv('02_Data_test.csv',delimiter=',')

foo = open('foo.csv', 'w')
with open('foo.csv', 'w', newline='') as outcsv:
    writer1 = csv.DictWriter(outcsv, fieldnames = ["##","lac","cid","msisdn","imei","event_type","tstamp","long","lat","max_dist","cell_type","start_angle","end_angle","msisdn1"])
    writer1.writeheader()

for i in range(0,122,1): #range(len(pairs)): 
    for j in range(0,174123,1): #range(len(df)):

        if pairs.iloc[i,0]==df.iloc[j,3]:
            c1+=1
            print(i)
            append_list_as_row('foo.csv', df.iloc[j,:])        
        if pairs.iloc[i,1]==df.iloc[j,3]:
            c2+=1
            print(i)
            print(j)
            print("")
            append_list_as_row('foo.csv', df.iloc[j,:])        

        #if pairs.iloc[i,1]==df.iloc[j,3]:
         #   c2+=1
          #  print(i)
           # print(j)
            #append_list_as_row('foo.csv', df.iloc[j,:])  

    print("------------------------")
    append_list_as_row('foo.csv', "")    

1 Ответ

0 голосов
/ 26 апреля 2020

Вы можете использовать функцию pd.isin ([list]) pandas .DataFrame для извлечения данных из CSV2, которые принадлежат паре msisdn чисел в вашем CSV1

Пример ввода

pairs
msisdn1   msisdn2
msisdn1  msisdn11
msisdn2  msisdn12
msisdn3  msisdn13
msisdn4  msisdn14
msisdn5  msisdn15

data
test    moretest    no_test    msisdn
test1   moretest1   no_test1   msisdn1
test2   moretest2   no_test2   msisdn2
test3   moretest3   no_test3   msisdn3
test4   moretest4   no_test4   msisdn4
test5   moretest5   no_test5   msisdn5
test6   moretest6   no_test6   msisdn6
test7   moretest7   no_test7   msisdn7
test8   moretest8   no_test8   msisdn8
test9   moretest9   no_test9   msisdn9
test10  moretest10  no_test10  msisdn10
test11  moretest11  no_test11  msisdn11
test12  moretest12  no_test12  msisdn12
test13  moretest13  no_test13  msisdn13
test14  moretest14  no_test14  msisdn14
test15  moretest15  no_test15  msisdn15
test16  moretest16  no_test16  msisdn16
test17  moretest17  no_test17  msisdn17
test18  moretest18  no_test18  msisdn18
test19  moretest19  no_test19  msisdn19
test20  moretest20  no_test20  msisdn20

Код:

csv1 = pd.read_csv('pairs.csv')
csv1 = pd.read_csv('02_Data_test.csv')
# res is a list that will hold all the extracted rows
# and we will finally append all results into a DataFrame
res = []
for pairs in csv1.values.tolist():
    res.append(csv2[csv2['msisdn'].isin(pairs)])

df = pd.concat(res)
df.to_csv('result.csv', index=False)

Пример вывода

      test    moretest    no_test    msisdn
0    test1   moretest1   no_test1   msisdn1
10  test11  moretest11  no_test11  msisdn11
1    test2   moretest2   no_test2   msisdn2
11  test12  moretest12  no_test12  msisdn12
2    test3   moretest3   no_test3   msisdn3
12  test13  moretest13  no_test13  msisdn13
3    test4   moretest4   no_test4   msisdn4
13  test14  moretest14  no_test14  msisdn14
4    test5   moretest5   no_test5   msisdn5
14  test15  moretest15  no_test15  msisdn15

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...