Объедините несколько столбцов в одну с одинаковым количеством строк - PullRequest
0 голосов
/ 02 октября 2019

Я снимаю цены с сайта, используя номера деталей. Логика такова:

  1. вводится список номеров деталей
  2. цена будет возвращена для каждой детали из базы данных на веб-сайте
  3. Часть принадлежитодна из пяти компаний, поэтому создаются 5 разных списков.

Например, ниже приведен исходный список номеров деталей (ввод):
b123
nadsf
ower
weoa

каждый из них принадлежит компании:

Part #     Company A        B          C          D
b123          1.5
nadsf                      3.4
ower                                             47
weoa                                  33

Вывод в csv прямо сейчас:

    0
0   1.5   
1   0     
2   0
3   0
0   0     
1   3.4   
2   0
3   0
0   0     
1   0     
2   33
3   0
0   0     
1   0     
2   0
3   47
0   0     
1   0     
2   0
3   0

Мне нужен только один список вместо 5;желаемый результат:

0    1.5

1    3.4

2    33

3    47

Не уверен, как я могу это сделать,

Любая помощь / предложения приветствуются!

Пожалуйста, см. ниже мой код:

import pandas as pd


df = pd.read_excel(r'C:\Users\212677036\Documents\Copy of MIC Parts Review.xlsx')
PN = pd.DataFrame(df, columns=['Product code'])

i = 0

Total_rows = PN.shape[0]
partnumlist = []
partnumlist1 = []
partnumlist2 = []
partnumlist3 = []
partnumlist4 = []
partnumlist5 = []

while i < Total_rows:

         data = {"partOptionFilter": {"PartNumber": PN.iloc[i, 0], "AlternativeOemId": "17155"}}
         r = requests.post('https://www.partsfinder.com/Catalog/Service/GetPartOptions', json=data).json()

         partnumlist.append(r['Data']['PartOptions'][0]['YourPrice'])

         data1 = {"partOptionFilter": {"PartNumber": PN.iloc[i, 0], "AlternativeOemId": "17475"}}
         r1 = requests.post('https://www.partsfinder.com/Catalog/Service/GetPartOptions', json=data1).json()

         partnumlist1.append(r1['Data']['PartOptions'][0]['YourPrice'])

         data2 = {"partOptionFilter": {"PartNumber": PN.iloc[i, 0], "AlternativeOemId": "16880"}}
         r2 = requests.post('https://www.partsfinder.com/Catalog/Service/GetPartOptions', json=data2).json()

         partnumlist2.append(r2['Data']['PartOptions'][0]['YourPrice'])

         data3 = {"partOptionFilter": {"PartNumber": PN.iloc[i, 0], "AlternativeOemId": "47221"}}
         r3 = requests.post('https://www.partsfinder.com/Catalog/Service/GetPartOptions', json=data3).json()

         partnumlist3.append(r3['Data']['PartOptions'][0]['YourPrice'])

         data4 = {"partOptionFilter": {"PartNumber": PN.iloc[i, 0], "AlternativeOemId": "17045"}}
         r4 = requests.post('https://www.partsfinder.com/Catalog/Service/GetPartOptions', json=data4).json()

         partnumlist4.append(r4['Data']['PartOptions'][0]['YourPrice'])

         data5 = {"partOptionFilter": {"PartNumber": PN.iloc[i, 0], "AlternativeOemId": "17055"}}
         r5 = requests.post('https://www.partsfinder.com/Catalog/Service/GetPartOptions', json=data5).json()

         partnumlist5.append(r5['Data']['PartOptions'][0]['YourPrice'])

         i=i+1

list_of_dataframes = [pd.DataFrame(partnumlist),pd.DataFrame(partnumlist1),
               pd.DataFrame(partnumlist2), pd.DataFrame(partnumlist3),
               pd.DataFrame(partnumlist4), pd.DataFrame(partnumlist5)]

pd.concat(list_of_dataframes).to_csv(r'C:\Users\212677036\Documents\output25.csv')

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Вы можете использовать логическое индексирование, чтобы удалить все нулевые значения и сбросить индекс так, чтобы он считался от 0 до N-1. Вам нужно сохранить результат pd.concat в переменной, прежде чем сохранять его в cvs. Вы можете сделать это следующим образом:

concatenated = pd.concat(list_of_dataframes)
clean = concatenated[concatenated[0] != 0].reset_index(drop=True)
clean.to_csv(r'C:\Users\212677036\Documents\output25.csv')

Это должно дать вам желаемый результат:

0    1.5
1    3.4
2    33
3    47

Просто, чтобы обеспечить дополнительное понимание, 0 в первом ряду вашего выводаCSV-файл - это имя столбца вашего DataFrame. По умолчанию Pandas использует индекс диапазона 0..M (M = количество столбцов), если вы не предоставляете его конструктору DataFrame.

Поэтому concatenated[0] выбирает первый столбец в вашем DataFrame иconcatenated[0] == 0 проверяет, равно ли каждое значение в вашем столбце 0, что приводит к серии значений True или False, которые затем можно использовать для выборочной индексации ваших данных.

0 голосов
/ 02 октября 2019

Я предполагаю, что текущий выход CSV, который вы получаете, соответствует этому шаблону 0 с. Вы можете применить простую операцию фильтрации к выходному CSV или к фрейму данных, который вы сохраняете как CSV.

Например, ваш выходной CSV преобразуется в Dataframe df.

df = pd.concat (list_of_dataframes) # предполагая, что это ваш вывод csv dataframe

Я не вижу имени столбца для df. Вы можете, вероятно, добавить имя столбца ко второму столбцу с 0 по вашему выбору. Если у вас есть это,

df = df [~ (df ['col'] == 0])]

Это удалит все строки с 0 во втором столбце (из-за~) и даст вам желаемый результат.

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